角度重复范围计算

时间:2015-11-02 18:48:13

标签: angularjs performance angularjs-scope

我正在构建一个执行大量计算的表单,例如汇总对象中的键

[
    { 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次迭代后结果应该相同。 我还将该函数实现为具有相同结果的过滤器。

1 个答案:

答案 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();
}]