为什么我的控制器执行两次?
我做了很多测试并返回相同的结果,它会影响我的应用程序吗?
<html ng-app="todoApp">
<head>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.0/angular.min.js"></script>
<script>
"use strict";
angular.module('todoApp', [])
.controller('TodoListController', function() {
var todoList = this;
var i = 0;
todoList.addTodo = function() {
console.log(1)
i++;
// return i it breaks the script
};
});
</script>
</head>
<body ng-controller="TodoListController as todoList">
{{todoList.addTodo()}}
</body>
</html>
&#13;
答案 0 :(得分:1)
Angular摘要周期存在问题。 addTodo()
将在循环运行的频率下执行,从1到几次迭代。
{{}}
)中的,绑定到范围变量,而不是函数,除非你知道你做了什么(它只绑定到幂等的getter函数)。并计算控制器中这些变量的值。像这样:
<html ng-app="todoApp">
<head>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.0/angular.min.js"></script>
<script>
"use strict";
angular.module('todoApp', [])
.controller('TodoListController', function() {
var todoList = this;
var i = 0;
todoList.addTodo = function() {
console.log(1)
i++;
return i;
};
todoList.todo = todoList.addTodo();
});
</script>
</head>
<body ng-controller="TodoListController as todoList">
{{todoList.todo}}
</body>
</html>
答案 1 :(得分:0)
你的控制器没有执行两次,你的函数addTodo执行了两次。发生这种情况会导致角度渲染视图两次。
将角度$watch读取到不足以及为什么{{}}执行两次。
在观察者注册范围后,监听器fn是 异步调用(通过$ evalAsync)来初始化观察者。在 在极少数情况下,这是不可取的,因为在何时调用侦听器 watchExpression的结果没有改变。检测这种情况 在监听器fn中,您可以比较newVal和oldVal。如果 这两个值是相同的(===)然后监听器被调用 初始化。