2016-01-11 68 views
4

我創建了一個基於該Angular.io tutorial on pipes一個簡單的狀態管道:angular2如何檢測有狀態管道中的更改?

@Pipe({ 
    name: 'fetch', 
    pure: false 
}) 

class FetchJsonPipe implements PipeTransform{ 
    private fetchedValue = 'waiting'; 
    private fetchedValue2 = 'waiting2'; 

    transform(value:string, args:string[]):any { 
     setTimeout(() => { 
      this.fetchedValue = 'done'; 
      this.fetchedValue2 = 'done2'; 
     }, 3000); 
     return this.fetchedValue2; 
    } 
} 

@Component({ selector: 'sd-splash' 
      , template: 'hello ng2 {{ "5" | fetch }}' 
      , pipes: [FetchJsonPipe] 
      }) 

我的問題是,我從馬上#transform返回this.fetchedValue。 由於它只是一個字符串,它的返回值爲,值爲。稍後,當超時時間爲 完成時,我只需將值'done'分配給屬性(也是 私有)。

Angular2如何知道初始結果'waiting'不是最終的? 如何知道更新後的值將通過#fetchedValue? 許是不暴露在所有,Angular2對名字,我把結果存儲在該領域的 的任何信息。

它唯一的線索是pure == false,我想指示它 觀看實例變化。但我不知道它是如何獲得有關 哪些字段要收看的信息。

但它的工作!我不知道爲什麼。

乾杯

回答

6

角猴子補丁瀏覽器事件使用稱爲Zone.js.庫(包括setTimeout())當事件發生時,AngularJS觸發更改檢測。

對於有狀態的管道,AngularJS將重新評估每個事件的管道,因爲管道結果可能會改變,即使使用相同的輸入。

對於純管道,AngularJS只會在輸入發生變化(即進入數據或參數)時觸發變化檢測並重新評估管道。

+0

謝謝!以及它如何知道它應該爲新值查找'fetchedValue'屬性? – sevcsik

+0

在更改檢測期間,angularjs檢查* all *綁定的更改。 – pixelbits

+0

我更新了代碼示例以使用'#fetchedValue'和'#fetchedValue2'。如果我返回'this.fetchedValue2',它會在超時觸發時用'#fetchedValue2'正確更新值。我的問題是,它是如何知道它應該用'#fetchedValue2'更新視圖而不是'#fetchedValue'?轉換函數最初只返回「waiting」,沒有指出它的屬性。也沒有任何屬性綁定在任何地方。 – sevcsik

2

爲了理解這一點,我認爲最好看一下Zone.js的談話。 在setTimeout調用完成後(如果需要),基本上角度使用名爲zone的庫來執行$ rootScope摘要。

不僅如此,即使在任何promise解析之後,摘要循環也會觸發。

這正是因爲它不知道哪些屬性可能已經改變,所以它髒了檢查整個應用程序。