2016-04-16 32 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 }} 

角意志在視圖中爲您評估此值,並且摘要不會繼續遞增對象屬性值