Javascript 如何向Ember.js对象动态添加观察者方法
因此,我尝试将这些观察者方法动态添加到Ember.js对象中Javascript 如何向Ember.js对象动态添加观察者方法,javascript,coffeescript,ember.js,Javascript,Coffeescript,Ember.js,因此,我尝试将这些观察者方法动态添加到Ember.js对象中 holderStandoutCheckedChanged: (-> if @get("controller.parent.isLoaded") @get("controller").toggleParentStandout(@get("standoutHolderChecked")) ).observes("standoutHolderChecked") holderPaddingCheckedChan
holderStandoutCheckedChanged: (->
if @get("controller.parent.isLoaded")
@get("controller").toggleParentStandout(@get("standoutHolderChecked"))
).observes("standoutHolderChecked")
holderPaddingCheckedChanged: (->
if @get("controller.parent.isLoaded")
@get("controller").toggleParentPadding(@get("holderPaddingChecked"))
).observes("holderPaddingChecked")
holderMarginCheckedChanged: (->
if @get("controller.parent.isLoaded")
@get("controller").toggleParentMargin(@get("holderMarginChecked"))
).observes("holderMarginChecked")
到目前为止,我已经有了这段代码,但是没有调用item.methodToCall函数
methodsToDefine = [
{checkerName: "standoutHolderChecked", methodToCall: "toggleParentStandout"},
{checkerName: "holderPaddingChecked", methodToCall: "toggleParentPadding"},
{checkerName: "holderMarginChecked", methodToCall: "toggleParentMargin"}
]
add_this = { }
for item in methodsToDefine
add_this["#{item.checkerName}Changed"] = (->
if @get("controller.parent.isLoaded")
@get("controller")[item.methodToCall](@get(item.checkerName))
).observes(item.checkerName)
App.ColumnSetupView.reopen add_this
谁能告诉我我做错了什么?有更好的方法吗?我应该在混音室里这样做吗?如果是,请我不知道您的确切用例,但正如您所说,您描述的问题可以通过Mixin解决,请参阅 JavaScript: 示例用例:
var myObj = Ember.Object.create(App.Stalker, {
toggleParentStandout: function() {
console.log("toggleParentStandout called");
},
toggleParentPadding: function() {
console.log("toggleParentPadding called");
},
toggleParentMargin: function() {
console.log("toggleParentMargin called");
}
});
myObj.set('standoutHolderChecked', 42);
myObj.set('holderPaddingChecked', 'Buster');
另一个实现是一个mixin,它使用一个数组
watchProperties
,这是一个应遵守的属性列表,请参见:
JavaScript:
App=Em.Application.create();
App.stapper=Ember.Mixin.create({
init:function(){
这个;
var props=this.get('watchProperties');
assert(“watchProperties应该是一个数组”,Ember.isArray(props));
props.forEach(函数(属性){
//更改时调用已更改。。。
Ember.addObserver(这个,属性,这个,'%@Changed'.fmt(属性));
},这个);
},
willDestroy:function(){
这个;
this.get('watchProperties').forEach(函数(属性){
Ember.removeObserver(这个,属性,这个,'%@Changed'.fmt(属性));
},这个);
}
});
var o=Ember.Object.create(App.stapper{
//“a b”.w()=['a',b']
watchProperties:'ab'.w(),
更改:函数(){
console.log(“变更”);
}
});
o、 集合('a',123);
这为我解决了很多问题,谢谢。试图找出如何观察字段。@each.value
而不必通过数组循环找出更改的内容。这允许我执行一种代理,让动态表单字段对象与外观非常不同的模型进行通信。
var myObj = Ember.Object.create(App.Stalker, {
toggleParentStandout: function() {
console.log("toggleParentStandout called");
},
toggleParentPadding: function() {
console.log("toggleParentPadding called");
},
toggleParentMargin: function() {
console.log("toggleParentMargin called");
}
});
myObj.set('standoutHolderChecked', 42);
myObj.set('holderPaddingChecked', 'Buster');
App = Em.Application.create();
App.Stalker = Ember.Mixin.create({
init: function() {
this._super();
var props = this.get('watchProperties');
Ember.assert("watchProperties should be an array", Ember.isArray(props));
props.forEach(function(property) {
// invoke <property>Changed when <property> changes ...
Ember.addObserver(this, property, this, '%@Changed'.fmt(property));
}, this);
},
willDestroy: function() {
this._super();
this.get('watchProperties').forEach(function(property) {
Ember.removeObserver(this, property, this, '%@Changed'.fmt(property));
}, this);
}
});
var o = Ember.Object.create(App.Stalker, {
// 'a b'.w() == ['a', 'b']
watchProperties: 'a b'.w(),
aChanged: function() {
console.log("a changed");
}
});
o.set('a', 123);