【问题标题】:Best way to detect if an Ember.Object is dirty检测 Ember.Object 是否脏的最佳方法
【发布时间】:2012-08-10 12:57:16
【问题描述】:

我有一个 ember 对象,我想知道它是否处于脏状态。

var App.Post = Ember.Object.create({
   title: "Test",
   isDirty: false
});
App.Post.set("title", "Test2");
App.Post.get("isDirty") // Should === true

目前,我已经尝试为对象重载集合

App.Post = Ember.Object.create({
   set: function(path, value) {
       this._super(path, value);
       this._super("isDirty", true);
   }
})

当我直接调用 myObject.set 时它可以工作,但在使用 embers 绑定时它似乎没有使用该 set 函数。我添加了日志,并且常规的 emberjs 绑定工作流不会调用此方法。

我尝试的另一件事是添加一个观察者来切换脏标志。

App.Post = Ember.Object.create({
   hasBeenModified: function() {
      this.set("isDirty", true);
   }.observes("title")
})

由于仍然未知的原因,当我在模型级别使用观察时,我的绑定在 UI 中不再起作用。

【问题讨论】:

  • 您可能想查看 ember-data。它为您提供了一个模型对象(从 Object 扩展而来),它可以满足您所有的“isDirty”需求。它还有许多其他不错的功能,可以轻松获取/更新模型对象和创建模型关系。而且在您的更高级别中,您不应该再担心“isDirty”状态了。使用 ember 的要点之一是不再担心所有数据状态的管理,只需将模板绑定到数据(您的数据更新和模板更新;不需要额外的引导)。
  • 因为我根本不使用 ember-data,我宁愿有一些我不需要添加 ember-data 的东西,只是为了验证脏度。我想我会尝试 deepCopy,deepCompare 我有问题的对象。

标签: ember.js


【解决方案1】:

我相信您可能还需要覆盖 setUnknownProperty。 UI 使用Ember.set(object, key, value)。如果你看一下实现

https://github.com/emberjs/ember.js/blob/master/packages/ember-metal/lib/property_set.js#L60 它不会调用您的 setter,但会调用 setUnknownProperty(如果存在)。

其实在

https://github.com/emberjs/ember.js/blob/master/packages/ember-metal/lib/property_set.js#L52

如果您在 App.Post 类中预定义了字段,他们似乎会调用您的 setter。

【讨论】:

    猜你喜欢
    • 2020-11-04
    • 1970-01-01
    • 2020-09-07
    • 1970-01-01
    • 2013-06-09
    • 2011-02-17
    • 1970-01-01
    • 1970-01-01
    • 2011-01-04
    相关资源
    最近更新 更多