8

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

IE

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

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

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

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

4

1 回答 1

1

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

如果在找不到名称时想要一些通知行为,可以通过装饰 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。

此外,有关装饰指令的更多信息,请参阅这篇不错的博客文章

于 2014-05-28T23:06:23.917 回答