2014-09-01 14 views
0

下面的代碼片段:AngularJS:過濾器被解僱許多次,價值往往不確定

<h1> 
    {{pid.pname}} 
    <span style="font-size: 0.75em; text-shadow: none;">({{pid.pos}})</span> 
    <span style="font-size: 0.5em; text-shadow: none;"><a ng-href="#/team/{{pid.team | the_link}}/">{{pid.group}}</a></span> 
</h1> 

過濾the_link像這樣定義...

​​

alert()呼叫發射上裝載幾次頁面 - 似乎每次解析{{...}}(片段中的4次),除了最後處理ngHref的一次外,它都是未定義的。另外,$interpolate:interr被四次點燃三次...

這是爲什麼?我想我誤解了某種生命週期。任何清晰的讚賞。

+0

可以添加控制器或PID對象的數據結構 – Seminda 2014-09-01 00:42:29

+0

如何PID值被設置? Asyncronoously正確?您應該始終在您的過濾器中爲輸入保留空檢查,因爲您的過濾器將運行每個摘要循環,並且如果到那時數據不可用,您將在使用此過濾器的插值部分期間出現錯誤。請參閱http://plnkr.co/edit/jPx5LQ?p=preview – PSL 2014-09-01 01:51:04

+0

是的,異步。我在它周圍包裝了一個'typeof(longname)!='undefined'',它似乎可以工作。並不是完全通過綁定,但我明白了。我會讀。 – Wells 2014-09-01 02:12:05

回答

1

你的問題主要是你的過濾器沒有空檢查。您的過濾器將在每個摘要循環中運行,它可能會發生這樣的情況,即在摘要循環期間刷新自己時,插值指令可能還沒有pidpid.team的值。您可能試圖通過同步呼叫(例如:http,資源)加載它,因此,只要過濾器運行時未定義,您的過濾器就會失敗,您將看到在插值過程中捕獲到的錯誤$interpolate:interr。爲了解決這個問題,只需添加一個空檢查您的過濾器: -

return function(longname) { 
     //You should always do a null check because data might not be available by the time the filter runs. 

     if(!angular.isString(longname)) return; //or just if(!longname) return; 

     var parts = longname.split(' ') ; 
     return (parts[parts.length - 1] || "").toLowerCase(); //Just to be safer 
    } 

Plnkr

0

主要原因可以是你沒有定義團隊。

我已經完成了以下控制器的工作相同的過濾器。

function MyCtrl($scope) { 
$scope.pid={pname:'test', pos:'test pos',group:'f b c d',team:'A B C G T H J'}; 

}

觀看演示app

而且angularjs使用「髒檢查」的方法,所以它需要調用所有的過濾器,看看是否存在任何改變。之後,它會檢測到一個變量有變化,然後再次執行所有過濾器以檢測是否有其他變化。檢查這post

+0

那麼,在你的例子中,爲什麼'alert()'會因爲只有一個錨元素而觸發三次呢? – Wells 2014-09-01 01:17:41

+0

檢查鏈接http://stackoverflow.com/questions/9682092/databinding-in-angularjs – Seminda 2014-09-01 01:23:53