0

ngIf我正在使用从这个 SO answer获得的 Angular 1.0.3的临时指令。

// effectively
app.directive("ngIf", function () {                                             
    return function(scope, element, attrs) {                                 
            if (scope.$eval(attrs.ngIf)) {                                      
            } else {                                                            
                element.replaceWith(' ');                                       
            }                                                                   
        }                                                                       
    }                                                                           
});

该元素实际上已被删除。如果元素有ng-model(可能还有其他指令)Angular 会抱怨。

<input ng-if="msg == 'foo'" ng-model=msg>

如果msg不是foo,我们得到

错误:没有控制器:ngModel

这很可能与评估 ngModel 时删除的元素有关。

有什么方法可以重写ngIf指令以使错误不会发生?

JSFiddle 示例

4

1 回答 1

0

而不是

element.replaceWith(' '); 

利用

element.html('');

它工作正常。这是一个演示:http: //jsfiddle.net/sd3px/

这样您就不会删除在编译时建立的 Angular 属性。

当一个元素在编译时建立然后在链接中消失时,Angular 会变得相当难过。

ngif您可以在它自己的版本(自 1.1.5 起新)中看到 Angular 如何“使用其编译状态重新创建元素” : https ://github.com/angular/angular.js/blob/4612705ec297bc6ba714cb7a98f1be6aff77c4b8/src/ng/directive /ngIf.js

更新 1.2 测试:

我很想知道它是如何与 1.2.0 一起工作的。诚然,您可能只会ngif在 1.2 中使用 Angular。尽管如此,您的代码确实可以在 1.2 中使用,但只需对 usingelement.html('');而不是replaceWith.

这是一个显示在行动中的 plunker: http ://plnkr.co/edit/5jUzTH43OF2PqzMEbSz4?p=preview

于 2013-11-13T17:53:58.550 回答