我正在构建一个执行大量计算的表单,例如汇总对象中的键
[
{ bar: 5, .. },
{ bar: 6, .. },
...
]
我在HTML的当前35个地方使用此表达式。有时连接到进一步的计算和不同的键
<div>
{{ sumKeys('bar') + foobar }}
</div>
我使用的函数声明为
app.controller('someCtrl', function($scope){
$scope.sumKeys= function(key){
return (calculated sum);
}
}
我的问题是,如果我在任何输入字段中写入一个字母,则会调用sum函数约400次。我知道有一条规则,如果一个范围改变了10倍,那就调用该函数,但是不是更有效的方法吗?
我可以在不改变范围的情况下输出结果吗?或者强制这个计算只做一次?我知道结果不会改变任何涉及的范围。因此,在2次迭代后结果应该相同。 我还将该函数实现为具有相同结果的过滤器。
答案 0 :(得分:1)
您正在寻找的是 SINGLETON 服务。你可以像这样制作一个角度:(我的一个真实例子)
angular.module('ocFileUpload', [])
.service('ocFileUpload', ['$http', '$rootScope', function ($http, $rootScope) {
// Will house our files
this.files = [];
// This fn appends files to our array
this.addFile = function(files){
for (var i = 0; i < files.length; i++){
this.files.push(files[i]);
}
};
this.getFileDetails = function(ele){
// push files into an array.
for (var i = 0; i < ele.files.length; i++) {
this.files.push(ele.files[i])
}
};
this.removeFile = function(fileToRemove){
var indexOfFile = this.files.indexOf(fileToRemove);
this.files.splice(indexOfFile, 1);
};
this.clearFiles = function(){
this.files = [];
};
// Return files array
this.getFiles = function(){
return this.files;
};
}]);
然后只需在控制器/指令中使用它:
.controller(['ocFileUpload', function(ocFileUpload){
var ref = ocFileUpload.getFiles();
}]