在ngRepeat中更改对象

时间:2016-06-03 20:50:36

标签: javascript angularjs angularjs-ng-repeat

我通过ngRepat迭代一组对象。每个人都得到一个指令。在该指令中,我试图分配到最初工作正常的范围变量,但在更改数组时,它会被重置。

39dropdown.php

<test-directive obj="obj" ng-repeat="obj in objects"></test-directive>

演示:https://jsfiddle.net/byjvey2b/(点击要应用更改的项目,点击验证后会添加新元素,所有内容都会重置)。

只是相应地改变属性,而不是整个对象,不会帮助我,我实际上是在我自己的代码中重新分配不同的子类。

3 个答案:

答案 0 :(得分:2)

这有效: https://jsfiddle.net/ft8qgccf/

app.directive('testDirective', function() {
    return {
    restrict: 'E',
    scope: { obj: '=' },
    template: '<div><a ng-click="doTheThing()">{{obj.title}}</a></div>',
    link: function($scope, $element, $attrs) {
        $scope.doTheThing = function() {
        $scope.obj.title = 'Is changed';
      };
    }
  };
});

通过$scope.obj.title = 'Is changed';代替$scope.obj = { changed: true, title: 'Is changed.'};,您正在利用“点”。

基本上,“子范围使用原型继承来查找值,因此只要它永远不会在子节点上设置,那么它将遵循父范围”。因此,通过更改子作用域中obj的值,您将断开与父作用域的连接。阅读它here

答案 1 :(得分:1)

我认为这是预期的行为。 ng-repeat仍然循环“obj in objects”,数据将根据角度的周期以许多随机间隔刷新。在这里,您可以看到每次添加新项目时刷新数据。您没有更改“对象”数据,只更改对象数组中项目的本地引用。

尝试通过ng-repeat将$ index传递给项本地范围,

<a ng-click="doTheThing($index)">

然后更新数据

$scope.objects[index] = { changed: true, title: 'Is changed.'};

https://jsfiddle.net/byjvey2b/5/

答案 2 :(得分:0)

您可以调用控制器中的方法将原始对象替换为新对象。

<test-directive obj="obj" updated="replaceObject(obj, newObj)" ng-repeat="obj in objects">
</test-directive>

在控制器中:

$scope.replaceObject = function(object, newObject) {
    var i = $scope.objects.indexOf(object);
    $scope.objects.splice(i, 1, newObject);
}

指令:

scope: { 
    obj: '=',
    updated: '&'  
},
template: '<div><a ng-click="doTheThing()">{{obj.title}}</a></div>',
link: function($scope, $element, $attrs) {
    $scope.doTheThing = function() {
        $scope.updated({newObj: { changed: true, title: 'Is changed.'}});
  };
}

https://jsfiddle.net/j2mexyj0/2/