【发布时间】:2013-06-01 14:47:20
【问题描述】:
我有一个网页作为单个实体的编辑器,它位于 $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弄脏”代码之外,还有一种更清洁的方法来做到这一点......
【问题讨论】:
-
我还需要能够基于某些按钮重新加载 $scope.fieldcontainer(例如加载实体的先前版本)。为此,我需要暂停手表,重新加载,然后恢复手表。
-
您会考虑将我的答案更改为接受的答案吗?那些花时间仔细阅读的人往往会同意这是正确的解决方案。
-
@trixtur 我有同样的 OP 问题,但在我的情况下,你的答案不起作用,因为我的旧值不是
undefined。它有一个默认值,在我的模型更新没有提供所有信息的情况下是必需的。所以有些值不会改变,但必须触发。 -
@oliholz 因此,不要检查未定义,而是取出“typeof”并根据您的默认值检查 old_fieldcontainer。
-
@KevinHoffman 您应该将 MW 的答案标记为正确答案,以便其他人找到此问题。这是一个更好的解决方案。谢谢!