2015-05-22 107 views
2

我試圖通過在大多數地方使用一次性綁定(::)來保持我的手錶。角度「綁定兩次」

但是,我遇到了這種情況,我需要等待對象的一個​​屬性從我們的服務器到達。

有沒有可以讓Angular綁定兩次(第一個佔位符,第二個實際值)?

我試着用bindonce來完成這個,但它似乎沒有工作(我猜這是因爲bindonce想要看整個對象,而不是一個屬性)。

另一種解決方案是,如果我能以某種方式在價值進入後從模板中移除手錶(如果可能的話)。

我的對象是這個樣子:

{ 
name: 'Name', 
id: 'Placeholder' 
} 

而且我的模板:

<div ng-repeat="object in objects"> 
{{::object.name}} 
{{::object.id}} 
</div> 

ID將顯示在應用程序的生命時間一次且僅一次改變,有手錶永遠爲一個值,只會有一次變得浪費,因爲我們在列表中會有很多這樣的對象。

+1

使用null或undefined初始化id,而不是使用'Placeholder'對其進行初始化。 –

+0

是的,我試了這個(它的工作原理),但被告知,當我們等待數值到來時(等待時間可能會有所不同,介於幾毫秒和幾秒之間),不顯示任何東西是不可接受的。 – Milton

回答

1

我認爲這是你正在尋找的! Plunkr

我只是寫了一個綁定,兩次指示,如果我沒有完全錯過了問題,就應該解決您的問題:

directive("bindTwice", function($interpolate) { 
    return { 
     restrict: "A", 
     scope: false, 
     link: function(scope, iElement, iAttrs) { 
     var changeCount = 0; 

     var cancelFn = scope.$watch(iAttrs.bindTwice, function(value) { 
      iElement.text(value === undefined ? '' : value); 
      changeCount++; 
      if (changeCount === 3) { 
      cancelFn(); 
      } 
     }); 
     } 
    } 
    }); 

我做的是什麼,我需要範圍的元素上添加一個觀察者觀看和更新內容,就像ng-bind一樣。但是,當changeCount達到極限時,我只需取消$watch,從watchlist中有效清除它。

用法:

<body ng-controller="c1"> 
    <div ng-repeat="t in test"> 
     <p>{{ ::t.binding }}</p> 
     <p bind-twice="t.binding"></p> 
     <p>{{ t.binding }}</p> 
    </div> 
    </body> 

請參閱Plunkr的工作示例。