【问题标题】:Can you log angular data-binding errors?您可以记录角度数据绑定错误吗?
【发布时间】:2013-05-10 18:14:58
【问题描述】:

如果绑定的属性或表达式失败,是否有记录?

<input type="text" ng-model="user.name" />

当用户或名称未定义时记录?

编辑: 对于如何发生这种情况似乎有很多困惑。假设我对多个视图使用视图模型(或者我很健忘)

想象一下,我更改了 JS 代码,因此名称现在是 user.firstName 并且我忘记更新我的视图。我想在运行时记录它,以便修复它。

【问题讨论】:

  • 你应该确保你的数据在你的控制器中是有效的
  • 我想知道变量名是否在视图和控制器/范围之间不同步
  • 怎么会这样?
  • ng-model 将在当前范围内创建一个新属性,如果该属性(用户名)在其关联的控制器中尚不存在。所以属性不存在也不会报错
  • 视图仍然会被破坏。它将显示为空而不是所需的值。

标签: angularjs


【解决方案1】:

正如其他人在 cmets 中提到的那样,当属性未在范围中定义时,数据绑定本身不会“失败”,而是会在范围内透明地创建该属性。

如果您想在找不到名称时进行一些通知行为,您可以通过装饰 ng-model 指令来手动获取它,以检查其值是否在插入 DOM 时在作用域上定义。

.config(['$provide', function($provide) {
        $provide.decorator('ngModelDirective', ['$delegate', function($delegate){
            var directive = $delegate[0];

            // Save the old link function
            var link = directive.link;
            directive.compile = function() {
                return function(scope, element, attrs) {
                    link.apply(this, arguments);

                    // Now that we've applied the old link function, we can add
                    // any extra checks or steps we want
                    if (!objHasProperty(scope, attrs.ngModel)) {
                        alert("using ng-model value '" + attrs.ngModel +"' that wasn't defined first!"
                    }
                };
            };

            return $delegate;
        }]);
    }])

这将检查控制器范围内 ng-model 值的定义,如果未设置则发出警报。

查看工作中的jsfiddle,了解这可能会记录错字。

我没有在每个场景中测试或考虑过这个,所以它可能真的在某个地方被破坏了......我也不确定它将如何处理查找在父范围中定义的 attrs。

另外,请参阅 this nice blog post 了解有关装饰指令的更多信息。

【讨论】:

  • 刚刚在 Angular 1.3.8 上尝试过,在尝试调用 apply 方法时遇到了未定义的链接值。 directive.link 未定义。 :-/ 对此了解的不够深入,现在无法深入了解。
  • 这可能是答案,但这个答案很糟糕(不是你自己的错@crennie)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-28
  • 2016-05-26
  • 2013-10-21
  • 2012-04-04
  • 1970-01-01
  • 1970-01-01
  • 2019-03-31
相关资源
最近更新 更多