我知道这个问题已经在这里被问过了,似乎所有答案都是来自AngularJS doc的引用或者没有提供解决方案(不是我理解的解决方案)所以我会给出再试一次。
我对Angular的体验相对较新,是在几个月前开始的,所以如果这是基本知识,请原谅我的无知。
在帖子列表中(使用ng-repeat
进行迭代)我有一个特殊的"分享到"按钮。
按钮(href)上的链接取决于三个不同因素:post_id
,user_id
,network
。
我想在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
在这里我可以看到,该函数首先被调用两次,然后是四次 - 这表明我已经多次触发了摘要周期。
在所描述的这种情况下,我如何才能最好地在链接中生成某些值?这是最好的做法吗?如果不是,您如何或如何给我一个关于如何重构代码的例子。
答案 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>
这样,由于双向数据绑定行为,您将避免多次调用您的函数。
看一下以下链接: