Javascript 如何向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

因此,我尝试将这些观察者方法动态添加到Ember.js对象中

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);