首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在AngularJS中观察模型更改时,如何忽略初始加载?

在AngularJS中观察模型更改时,如何忽略初始加载?
EN

Stack Overflow用户
提问于 2013-06-06 03:01:51
回答 4查看 68.7K关注 0票数 188

我有一个网页,它充当单个实体的编辑器,它位于$scope.fieldcontainer属性中,是一个很深的图形。在我的REST API (通过$resource)得到响应后,我向'fieldcontainer‘添加了一个监视。我正在使用这个手表来检测页面/实体是否“脏”。现在,我正在使保存按钮弹出,但实际上我想让保存按钮不可见,直到用户弄脏模型。

我得到的是手表的单个触发器,我认为发生这种情况是因为.fieldcontainer = ...分配在我创建手表后立即发生。我正在考虑只使用一个"dirtyCount“属性来吸收最初的错误警报,但这感觉非常麻烦……我认为必须有一种“角度惯用”的方式来处理这个问题--我不是唯一一个使用手表来检测脏模型的人。

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

代码语言:javascript
复制
 $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脏”代码……

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-06-06 05:57:53

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

代码语言:javascript
复制
var initializing = true

然后,当第一个$watch触发时,执行

代码语言:javascript
复制
$scope.$watch('fieldcontainer', function() {
  if (initializing) {
    $timeout(function() { initializing = false; });
  } else {
    // do whatever you were going to do
  }
});

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

票数 120
EN

Stack Overflow用户

发布于 2014-05-08 07:55:25

我意识到这个问题已经得到了回答,但我有一个建议:

代码语言:javascript
复制
$scope.$watch('fieldcontainer', function (new_fieldcontainer, old_fieldcontainer) {
    if (typeof old_fieldcontainer === 'undefined') return;

    // Other code for handling changed object here.
});

使用标志是可行的,但是有一点code smell,你不这样认为吗?

票数 44
EN

Stack Overflow用户

发布于 2016-08-04 05:58:53

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

代码语言:javascript
复制
$scope.$watch('fieldcontainer', 
  function(newValue, oldValue) {
    if (newValue && oldValue && newValue != oldValue) {
      // here what to do
    }
  }), true;
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16947771

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档