在AngularJS中观看模型更改时,如何忽略初始负载?

我有一个网页作为单个实体的编辑器,它在$ scope.fieldcontainer属性中是一个深层图。 在我的REST API(通过$ resource)获得响应之后,我将一个手表添加到“fieldcontainer”中。 我正在使用此手表来检测页面/实体是否“脏”。 现在我正在使保存button反弹,但我真的想让保存button隐藏,直到用户弄脏模型。

我得到的是手表的一个触发器,我认为这是因为.fieldcontainer = …赋值在我创build手表后立即发生。 我正在考虑使用“dirtyCount”属性来吸收最初的虚警,但这感觉非常黑客…我认为必须有一个“Angular idiomatic”方式来处理这个问题 – 我不是唯一使用手表来检测脏模型。

以下是我设置手表的代码:

$scope.fieldcontainer = Message.get({id: $scope.entityId }, function(message,headers) { $scope.$watch('fieldcontainer', function() { console.log("model is dirty."); if ($scope.visibility.saveButton) { $('#saveMessageButtonRow').effect("bounce", { times:5, direction: 'right' }, 300); } }, true); }); 

我只是一直认为有一个更清洁的方式来做这个比“if(dirtyCount> 0)”守护我的“UI污染”代码…

在初始加载之前设置一个标志,

 var initializing = true 

然后当第一个$ watch发生火灾时

 $scope.$watch('fieldcontainer', function() { if (initializing) { $timeout(function() { initializing = false; }); } else { // do whatever you were going to do } }); 

该标志将在当前摘要周期结束时被拆除,所以下一次更改不会被阻止。

聆听者第一次被调用时,旧值和新值将是相同的。 所以就这样做:

 $scope.$watch('fieldcontainer', function(newValue, oldValue) { if (newValue !== oldValue) { // do whatever you were going to do } }); 

这实际上是Angular文档build议处理它的方式 :

在向范围注册观察者之后,侦听器fn被asynchronous调用(通过$ evalAsync)来初始化观察者。 在极less数情况下,这是不可取的,因为在watchExpression的结果没有改变时调用监听器。 要在侦听器fn中检测到这种情况,可以比较newVal和oldVal。 如果这两个值是相同的(===),那么由于初始化,监听器被调用

我意识到这个问题已经回答了,不过我有一个build议:

 $scope.$watch('fieldcontainer', function (new_fieldcontainer, old_fieldcontainer) { if (typeof old_fieldcontainer === 'undefined') return; // Other code for handling changed object here. }); 

使用标志的作品,但有一点代码气味 ,你不觉得吗?

只要有效的新的val的状态:

 $scope.$watch('fieldcontainer',function(newVal) { if(angular.isDefined(newVal)){ //Do something } }); 

在当前值的初始加载期间,旧值字段是未定义的。 所以下面的例子可以帮助您排除初始加载。

 $scope.$watch('fieldcontainer', function(newValue, oldValue) { if (newValue && oldValue && newValue != oldValue) { // here what to do } }), true;