AngularJS:控制器中的函数被模板多次调用

时间:2016-05-12 18:24:33

标签: javascript angularjs angularjs-scope angular-controller angular-digest

我知道这个问题已经在这里被问过了,似乎所有答案都是来自AngularJS doc的引用或者没有提供解决方案(不是我理解的解决方案)所以我会给出再试一次。

我对Angular的体验相对较新,是在几个月前开始的,所以如果这是基本知识,请原谅我的无知。

在帖子列表中(使用ng-repeat进行迭代)我有一个特殊的"分享到"按钮。
按钮(href)上的链接取决于三个不同因素:post_iduser_idnetwork

我想在ng-repeat="post in posts"

中尝试这样做

<a href ng-href="{{genShareUrl(post.id,post.author_id,'fb')}}>Facebook</a>

执行生成的原始函数在工厂中,我只使用genShareUrl作为控制器和工厂之间的中间函数。

从帖子控制器中的genShareUrl函数注销时,我看到多次调用此函数 实际上,如果我在从后端获取的所有帖子上全面运行它,我的应用程序就会停止。没有错误,只是永恒的加载(我认为我可能无意中触发了某种永久的$ digest循环,我不熟悉或者至少有一些指数级的调用模式)。

我尝试用一​​个简单的例子重新创建场景:
http://codepen.io/Mestika/pen/xVexRa

在这里我可以看到,该函数首先被调用两次,然后是四次 - 这表明我已经多次触发了摘要周期。

在所描述的这种情况下,我如何才能最好地在链接中生成某些值?这是最好的做法吗?如果不是,您如何或如何给我一个关于如何重构代码的例子。

2 个答案:

答案 0 :(得分:1)

Angular使用脏检查来实现双向绑定,所有双向绑定观察者都会在每个摘要周期中进行评估,这就是多次调用genShareUrl的原因,为了避免这种情况发生,你可以使用模板中的单向绑定:

<a href ng-href="{{::genShareUrl(post.id,post.author_id,'fb')}}>Facebook</a>

答案 1 :(得分:0)

我想为您的案例建议最佳做法:

  

在激活功能中解析控制器的启动逻辑。

因此,您可以按如下方式添加activate函数:

activate();

function activate() {
    angular.forEach($scope.json, function (p) {
        p.btoa = $scope.func(p.id);
    });
}

之后,您可以更新模板并使用:

<div ng-repeat="person in json">
    <a href ng-href="/user/{{person.btoa}}">{{person.firstName + ' ' + person.lastName}}</a>    
  </div>

这样,由于双向数据绑定行为,您将避免多次调用您的函数。

看一下以下链接: