gpt4 book ai didi

javascript - 在集合中的二级更改后重新渲染 ng-options

转载 作者:可可西里 更新时间:2023-11-01 01:32:33 25 4
gpt4 key购买 nike

问题

我有一个组合框,基本上是一个 select 元素,通过 ng-options 填充了一组复杂对象。当我更新二级集合的任何对象时,此更改不会应用到组合框。

这也是documented在 AngularJS 网站上:

Note that $watchCollection does a shallow comparison of the properties of the object (or the items in the collection if the model is an array). This means that changing a property deeper than the first level inside the object/collection will not trigger a re-rendering.

Angular View

<div ng-app="testApp">
<div ng-controller="Ctrl">
<select ng-model="selectedOption"
ng-options="(selectedOption.id + ' - ' + selectedOption.name) for selectedOption in myCollection track by selectedOption.id">
</select>
<button ng-click="changeFirstLevel()">Change first level</button>
<button ng-click="changeSecondLevel()">Change second level</button>
<p>Collection: {{ myCollection }}</p>
<p>Selected: {{ selectedOption }}</p>
</div>
</div>

Angular Controller

var testApp = angular.module('testApp', []);

testApp.controller('Ctrl', ['$scope', function ($scope) {

$scope.myCollection = [
{
id: '1',
name: 'name1',
nested: {
value: 'nested1'
}
}
];

$scope.changeFirstLevel = function() {
var newElem = {
id: '1',
name: 'newName1',
nested: {
value: 'newNested1'
}
};
$scope.myCollection[0] = newElem;
};

$scope.changeSecondLevel = function() {
var newElem = {
id: '1',
name: 'name1',
nested: {
value: 'newNested1'
}
};
$scope.myCollection[0] = newElem;
};

}]);

您也可以在 this JSFiddle 中实时运行它.

问题

我确实理解 AngularJS 出于性能原因不会在 ng-options 中监视复杂对象。 但是是否有任何解决方法,即我可以手动触发重新渲染吗?一些帖子提到 $timeout$scope.apply 作为解决方案,但我都无法利用。

最佳答案

我之前使用的一个快速技巧是将您的选择放在 ng-if 中,将 ng-if 设置为 false,然后在 $timeout 为 0 后将其设置回 true。这将导致 angular 重新渲染控制。

或者,您可以尝试使用 ng-repeat 自己渲染选项。不确定这是否可行。

关于javascript - 在集合中的二级更改后重新渲染 ng-options,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45161446/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com