Angular"绑定两次"

时间:2015-05-22 06:19:27

标签: angularjs

我试图通过在大多数地方使用一次性绑定(::)来保持我的手表。

但是,我遇到了需要等待对象的一个​​属性从我们的服务器到达的情况。

有没有我可以两次进行Angular绑定(首先是占位符,第二个是实际值)?

我尝试使用bindonce完成此操作,但它似乎不起作用(我猜这是因为bindonce想要观看整个对象,而不是单个属性)。

另一种解决方案是,如果可以的话,我可以在值进入后以某种方式从模板中删除手表。

我的对象看起来像这样:

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

我的模板:

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

ID会在应用程序生命周期中改变一次,只会永久改变一个值,只有在我们在列表中包含许多这些对象时才会感到浪费的值。

1 个答案:

答案 0 :(得分:1)

我认为这就是你要找的! Plunkr

我刚刚编写了一个bind-two指令,如果我没有完全错过这个问题,它应该解决你的问题:

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从监视列表中有效清除它。

用法:

  <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了解工作示例。