0

我知道這個問題已經在這裏被問到,似乎所有的答案是從AngularJS文檔中引用或不提供解決方案(不是解決方案,我反正理解),所以我會再試一次。AngularJS:通過模板多次調用控制器的函數

我對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

在這裏我可以看到,該函數首先被調用了兩次,然後四次 - 這表明,我認爲摘要週期觸發多次。

在這樣的情況下,我如何最好地在鏈接中產生一些價值?這是最佳做法嗎?如果不是的話,你如何還是可以給我一個關於如何重構代碼的例子。

回答

1

Angular使用髒檢查來實現雙向綁定,所有雙向綁定觀察者將在每個摘要循環中進行評估,這就是爲什麼要多次調用genShareUrl,爲避免發生這種情況,可以使用單向在你的模板結合:

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

這樣一來,你會避免多次由於雙向數據綁定行爲而調用您的函數。

看看下面的鏈接:

相關問題