Angularjs 角度重复范围计算

Angularjs 角度重复范围计算,angularjs,performance,angularjs-scope,Angularjs,Performance,Angularjs Scope,嗨,我正在构建一个表单,进行大量计算,例如汇总对象中的键 [ { bar: 5, .. }, { bar: 6, .. }, ... ] 我目前在HTML的35个位置使用这个表达式。有时连接到进一步的计算,并使用不同的键 <div> {{ sumKeys('bar') + foobar }} </div> 我的问题是,如果我在任何输入字段中写入一个字母,求和函数将被调用大约400次。我知道有一条规则,如果一个作用域被更改了10次,它就会

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

[
    { bar: 5, .. },
    { bar: 6, .. },
    ...
]
我目前在HTML的35个位置使用这个表达式。有时连接到进一步的计算,并使用不同的键

<div>
    {{ sumKeys('bar') + foobar }}
</div>
我的问题是,如果我在任何输入字段中写入一个字母,求和函数将被调用大约400次。我知道有一条规则,如果一个作用域被更改了10次,它就会调用这个函数,但是没有更有效的方法吗

我可以在不改变范围的情况下输出结果吗?还是强迫这个计算只做一次?我知道结果不会改变任何涉及的范围。因此,经过2次迭代后,结果应该是相同的。
我还实现了一个具有相同结果的过滤器功能。

您正在寻找的是一个单例服务。你可以这样做:(我的一个真实例子)


我会制作一个模型(angular中的工厂),并将您所有的逻辑都保存在那里,以获得您想要的结果数据。您可以通过调用模型上的函数来进行一次计算。@ajmajma的意思是使用服务/工厂来创建一个API,您可以将其作为单例公开。因此,此时您所要做的就是将服务/工厂注入所需的w.e。您好,感谢您的精彩回复。我试着用服务实现它,但不知何故失败了。啊,对不起,不能再编辑第一条评论了。我成功了。谢谢你的帮助!
app.controller('someCtrl', function($scope){
    $scope.sumKeys= function(key){
        return (calculated sum);
    }
}
 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();
}]