angular如何实现bind-once指令?

时间:2015-02-18 08:14:11

标签: javascript angularjs

我查看了源代码但未找到相关的代码段。我对绑定一次的观察者以及附加它们的方式特别感兴趣。目前我已完成以下工作:

var removeNodeTypeWatcher = scope.$watch(function () {
    return paneController.getNodeType();
}, function (value) {
    if (value) {
        scope.nodeType = value;
        // as soon as the value is defined we no longer need watcher
        removeNodeTypeWatcher();
    }
});

1 个答案:

答案 0 :(得分:2)

您可以使用特定表达式

  

::

像这样:

<div>{{::item}}</div>

<ul>  
   <li ng-repeat="item in ::items">{{item}}</li>
</ul>

从角度1.3开始绑定表达式:bind once since 1.3

此外,还有特定的库,如:

angular-oncebindonce

修改

我在angularjs 1.3的源代码中找到了以下函数:

function oneTimeWatch(scope, listener, objectEquality, deregisterNotifier, parsedExpression) {
    var unwatch, lastValue;
    return unwatch = scope.$watch(function oneTimeWatch(scope) {
        return parsedExpression(scope);
    }, function oneTimeListener(value, old, scope) {
        lastValue = value;
        if (isFunction(listener)) {
            listener.apply(this, arguments);
        }
        if (isDefined(value)) {
            scope.$$postDigest(function() {
                if (isDefined(lastValue)) {
                    unwatch();
                }
            });
        }
    }, objectEquality, deregisterNotifier);
}

它位于src/ng/parse.js,从第1031行开始:oneTimeWatch

但是,在1.4中,该函数被称为

  

oneTimeWatchDelegate