【问题标题】:"Referencing the Window in Angular expressions is disallowed!" occurs when not using window“不允许在 Angular 表达式中引用窗口!”不使用窗口时发生
【发布时间】: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


【解决方案1】:

所以我不确定为什么会在这个特定的表达式上引发错误,因为我在这个表达式之前有很多表达式,但我发现了问题。

在我的控制器中,我总是使用$scope.model 作为我的视图模型,我通常通过执行类似的操作来初始化模型

function HomeViewModel(){
    this.title = "Hello";
    this.content = "World!";
}

$scope.model = new HomeViewModel();

然而我不小心只有

$scope.model = HomeViewModel();

所以我忘记了我的new 运算符。省略new 运算符会导致我的HomeViewModel 类中的this 引用变成window 的引用。因此,而不是:

$scope.model = {
    title: "Hello",
    content: "World!"
}

$scope.model 等于 windowtitlecontent 扩展。因此,较新版本的 Angular 会运行检查以确保对象不是 window 对象,这会导致检查失败并引发异常。

出于某种原因,在 AngularJS v1.2.19 之前,从未进行过此检查,因此我的代码一直在“工作”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-29
    • 2020-10-29
    • 2014-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多