2015-05-22 162 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的工作示例。