我有一个网页用作单个实体的编辑器,它位于 $scope.fieldcontainer 属性中的深度图。从我的 REST API(通过 $resource)获得响应后,我将手表添加到“fieldcontainer”。我正在使用这款手表来检测页面/实体是否“脏”。现在我正在让保存按钮弹跳,但我真的想让保存按钮不可见,直到用户弄脏模型。
我得到的是手表的单个触发器,我认为这是因为 .fieldcontainer = … 分配在我创建手表后立即发生。我正在考虑只使用“dirtyCount”属性来吸收最初的误报,但这感觉非常hacky......我认为必须有一种“Angular 惯用”的方式来处理这个问题 - 我不是唯一的一个使用手表检测脏模型。
这是我设置手表的代码:
$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 } });
该标志将在当前摘要周期结束时被拆除,因此不会阻止下一个更改。