You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Angular 1.5与1.8中ng-repeat差异:select选项值JSON序列化问题

问题

在Angular 1.5.5中,使用以下代码将对象数组填充到<select>元素时,{{item}}会输出对象的JSON格式字符串,但升级到1.8.2后,{{item}}输出[object object],需要让value属性获取对象的JSON表示:

<label class="select" ng-show="standardFieldList.length > 0">
    <select class="input-sm" ng-model="selectedStandardField" ng-change="addField('selectedStandardField')">
        <option value="">Add Standard Field</option>
        <option ng-repeat="item in standardFieldList" value="{{item}}" ng-if="!item.hide">{{item.value}}</option>
    </select>
    <i></i>
</label>
解决方案

方法1:使用Angular内置json过滤器

Angular提供了内置的json过滤器,可直接将对象转换为JSON字符串。修改option的value属性:

<option ng-repeat="item in standardFieldList" value="{{item | json:0}}" ng-if="!item.hide">{{item.value}}</option>
  • json:0表示生成无缩进的紧凑JSON字符串;如果需要带格式的JSON,直接使用{{item | json}}即可。

方法2:在控制器中预先转换JSON

如果需要更灵活的处理逻辑,可以在控制器中提前将每个对象转换为JSON字符串,比如给数组元素添加jsonStr属性:

// 控制器代码示例
$scope.standardFieldList = standardFieldList.map(item => ({
    ...item,
    jsonStr: angular.toJson(item, false) // false参数禁用缩进
}));

随后在模板中直接使用预先处理好的字符串:

<option ng-repeat="item in standardFieldList" value="{{item.jsonStr}}" ng-if="!item.hide">{{item.value}}</option>

方法3:改用ng-options(推荐)

Angular官方更推荐使用ng-options处理<select>选项绑定,这种方式无需手动处理JSON,直接将对象绑定到ng-model:

<label class="select" ng-show="standardFieldList.length > 0">
    <select class="input-sm" 
            ng-model="selectedStandardField" 
            ng-change="addField('selectedStandardField')"
            ng-options="item as item.value for item in standardFieldList | filter: {hide: false}">
        <option value="">Add Standard Field</option>
    </select>
    <i></i>
</label>

此时selectedStandardField直接对应选中的对象,后续addField方法可直接使用该对象,无需解析JSON。


内容的提问来源于stack exchange,提问作者Leventogenna

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 21:57:21