如何观察所有对象属性的变化?
Posted
技术标签:
【中文标题】如何观察所有对象属性的变化?【英文标题】:How to observe all object property changes? 【发布时间】:2014-04-18 18:20:58 【问题描述】:对于数组,我知道你可以这样做:
function()
.observes("array.@each")
我所做的是将对象转换为数组并使用@each 观察属性,但是有没有更好的方法来观察对象的所有属性变化而不将其转换为数组?
【问题讨论】:
function() .observes("array.@each") 真的有效吗?根据此处的答案,无法观察数组中的任何属性:***.com/a/24893070/188740 实际上我已经有一段时间没有使用这种观察器了,但我记得它工作正常。它的行为必须与 kingpin2k 的答案中的数组相同。[] 【参考方案1】:您可以观察isDirty
以查看自上次保存后是否有任何对象的值被修改(如果您使用的是 Ember 数据)。
或者,您可以将逗号分隔的属性列表传递给observes
。如果您的对象有很多属性,这可能会很长,但会起作用。
第三种方法可能是覆盖setUnknownProperty()
并设置一个属性,一个“脏标志”(或在那里执行您可能想要的任何操作。
还有一个old SO post 给出了以下答案:
App.WatchedObject = Ember.Object.extend(
firstProp: null,
secondProp: "bar",
init: function()
this._super();
var self = this;
Ember.keys(this).forEach(function(key)
if(Ember.typeOf(self.get(key)) !== 'function')
self.addObserver(key, function()
console.log(self.get(key));
);
);
);
你可以把它拆分成一个 Mixin 来保持你的代码 DRY。
【讨论】:
1.不幸的是,弄乱 isDirty 标志是不可靠的。一旦设置了 isDirty 标志,在保存之前它不会被切换。所以在保存时切换为真和切换为假之间的任何变化都不会被观察到。 2. 发送整个观察列表不是 DRY。我会不惜一切代价避免这种情况。 3. 好吧,最后一个可以工作,虽然我不是它的忠实粉丝。我想要一些不需要设置标志的东西。 是的,我同意这些选项都不是理想的,但据我所知,Ember 本身并不能处理这个问题。我找到了一个旧的 SO 答案并将其包含在上面【参考方案2】:您可能可以创建类似 blabbermouth
的 mixin 并覆盖 set
方法以获得属性更改的通知:
App.BlabbermouthMixin = Ember.Mixin.create(
set: function(keyName, value)
this.set('updatedProperty', keyName);
this._super(keyName, value);
);
并观察updatedProperty
属性?
【讨论】:
这不会标记同一属性的后续修改,直到在此过程中更改另一个属性。另外,您确定所有属性更改都通过set
进行吗?如果我们使用object.setProperties
更改对象的属性呢?该方法是否在内部使用set
?【参考方案3】:
您可以获取对象中的属性列表并将它们应用于新属性:
attrs = Ember.keys(observedObject);
var c = Ember.computed(function()
// Do stuff when something changes
)
Ember.defineProperty(target, propertyName, c.property.apply(c, attrs));
这是一个有效的jsbin。应该可以使用类似的方法创建观察者而不是属性。
【讨论】:
以上是关于如何观察所有对象属性的变化?的主要内容,如果未能解决你的问题,请参考以下文章