【发布时间】:2015-03-07 01:25:39
【问题描述】:
我最近从 AngularJS v1.2.17 迁移到了最新的稳定版本 v1.2.28,我意识到我的一个页面现在抛出了一堆 JS 错误告诉我以下内容:
错误:[$parse:isecwindow] 在 Angular 中引用窗口 不允许表达!表达式:model.skAccount.Phone
问题是我已经好几周没有碰过这段代码了,所以它不起作用是没有意义的。在模板或我的控制器中查找对window 的引用后,我什么也没找到。
这是这个表达式的 HTML 的样子:
<li>
<label for="inputAccountPhone">Phone number</label>
<input id="inputAccountPhone" type="text" sk-phone-number ng-model="model.skAccount.Phone" required/>
</li>
这只是一个简单的形式,绝对没有提到window。然后我将 AngularJS 版本恢复到 1.2.17,一切正常。这听起来像是 Angular 的错误吗?
请求的 skPhoneNumber 指令
app.directive('skPhoneNumber', function(){
return {
replace: false,
restrict: 'A',
scope: {
phone: '=ngModel'
},
link: function(scope){
scope.$watch('phone', function(newVal){
if(newVal){
scope.phone = newVal.replace( /^(\d{3})(\d{3})(\d{4})$/, '($1) $2-$3');
}
});
}
}
});
更新
经过进一步测试,发现问题是在v1.2.19
中引入的【问题讨论】:
-
什么是
sk-phone-number?你能告诉我们该指令的实现吗? -
是的,在输入上运行正则表达式并将数字格式化为电话号码是一个非常简单的指令。现在添加指令
-
再一次,我发誓没有引用
window我已经在整个模块中为这个应用程序进行了完整的搜索,它从未被使用过...... -
我不明白的是,当我的表达显然不涉及 Window 时,为什么 Angular 会给出这个错误
-
一定有某些原因导致它对那个特定的表达式有问题,即使它是一个错误。您可以在 plnkr 中重现该问题吗?也许可以在调试器中跟踪代码,看看为什么它认为该表达式正在引用窗口。
标签: angularjs