gpt4 book ai didi

javascript - 为什么每次模型更改时 Angular run controller 都会运行两次?

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

我的 Angular 应用程序由以下层组成:

  • service() 用于计算和数据处理
  • factory() 用作多个 Controller 的公共(public)数据存储
  • 几个controllers()

我的 Controller 公开来自工厂的函数,而工厂又从服务中调用函数。在 HTML 中,我运行 Controller 函数并向用户显示输出:{{ controller.function() }}

我注意到,当页面加载时,以及每次后续模型更改时,controller.function() 都会运行两次。为什么会这样?如何避免不必要的调用?

参见 working example - 打开浏览器 JS 控制台,单击 Run 并观察 console.log() 行被执行了两次。


JavaScript

angular.module('myApp',[])
.service('Worker', [function() {
this.i = 0;
this.sample = function(data) {
console.log(this.i.toString() + " " + Math.random().toString());
return JSON.stringify(data);
};
}])
.factory('DataStorage', ['Worker', function(worker) {
var self = this;
self.data = [{}, {}];
self.getData = function() {
return self.data;
}
self.sample = function() {
return worker.sample(self.data);
};
return {
getData: self.getData,
sample: self.sample
};
}])
.controller('MainController', ['DataStorage', function(DataStorage) {
var self = this;
self.data = DataStorage.getData();
self.sample = DataStorage.sample;
}])
.controller('DataSource', [function() {
var self = this;
self.data = ["one", "two", "three", "four", "five", "six"];
}])

HTML

<!DOCTYPE html>
<html ng-app="myApp">

<head>
<script data-require="angularjs@1.5.8" data-semver="1.5.8" src="https://opensource.keycdn.com/angularjs/1.5.8/angular.min.js"></script>
<script src="script.js"></script>
</head>

<body ng-controller="MainController as main">
<div ng-controller="DataSource as datasource">
<div ng-repeat="select in main.data">
<select ng-model="select.choice" ng-options="value for value in datasource.data">
<option value="">-- Your choice --</option>
</select>
</div>

<pre>
{{ main.sample() }}
</pre>
</div>
</body>

</html>

为什么这个函数在每次模型更改时都会运行多次,我如何确保它只运行一次?

我曾尝试将工厂函数输出分配给 Controller 变量(并在 HTML 中使用 {{ controller.function }} - 注意缺少括号),但是函数只运行一次。当模型更改时,它应该在新数据上运行。

StackOverflow 上报告的类似问题都与我没有使用的 ng-route 模块有关。

最佳答案

发生这种情况是因为您在这样的表达式中调用函数 sample():

{{ main.sample() }}

如果你使用这样的表达式,这个函数将至少被调用两次。

原因是因为 Angular 运行摘要循环直到所有内容都是最新的(因此,它至少会更新两次)。在您的情况下,它第一次运行以返回值,第二次运行以验证是否还有任何更改。

如果将函数放在 ng-change 指令中,则可以确保它只运行一次。

在你的情况下它将是:

 <select ng-model="select.choice" ng-change="main.sample()" ng-options="value for value in datasource.data">
<option value="">-- Your choice --</option>
</select>

关于javascript - 为什么每次模型更改时 Angular run controller 都会运行两次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41324845/

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