2016-04-16 33 views
0

我有一个被称为在我的范围内的方法,该方法对您通过的模型执行计算。角度正在修改范围内的方法

这导致无限循环,因为Angular正在修改原始对象,而不是方法中的本地副本。

HTML

<div ng-app="myApp"> 
    <ul ng-controller="TodoController"> 
     <li ng-repeat="todo in todos">{{ todo.name }} {{ doSomething(todo) }}</li> 
    </ul> 
</div> 

JS

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

app.controller('TodoController', ['$scope', function ($scope) { 

    $scope.todos = [{ 
     name:  'Todo 1', 
     someValue: 1 
    }]; 

    $scope.doSomething = function (todo) { 
     console.log(todo.someValue); 
     todo.someValue += 1; 
     return todo.someValue; 
    }; 

}]); 

如果你打开控制台,同时运行这一点,你会看到,它会导致一个无限循环在操作中查看这里https://jsfiddle.net/pvkpj169/

如何防止在此范围内修改原始模型的Angular?我想在这里做的任何修改都是本地的方法

+0

'VAR localVal = todo.someValue;'' localVal + = 1;'' 返回localVal;' 你的意思是创建一个本地副本? –

+0

这是由于角度消化周期的工作原理。如果范围在一个摘要内发生另一个摘要。这继续下去,直到范围稳定。你不断添加'todo.someValue + = 1;'每个摘要,所以它将是无限的。你究竟想要做什么? – charlietfl

回答

0

您的doSomething()通过添加您的待办事项的新副本使模型变得不稳定。

使用下面的控制器代码:

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

app.controller('TodoController', ['$scope', function($scope) { 

    $scope.todos = [{ 
    name: 'Todo 1', 
    someValue: 1 
    }]; 

    $scope.doSomething = function(todo) { 
    console.log(todo.someValue); 
    var val = todo.someValue + 1; 
    return val; 
    }; 

}]); 
0

如果是我,我会完全摆脱了函数及其变化:

{{ doSomething(todo) }} 

到:

{{ todo.someValue + 1 }} 

角意志在视图中为您评估此值,并且摘要不会继续递增对象属性值