2013-10-22 59 views
1

考慮這種情況。我有一個共同的邏輯,我想通過Ember.ArrayController和Ember.ObjectController實例重用。EmberJS繼承難題

兩個Ember.ArrayController和Ember.ObjectController是從基本Ember.Object衍生所以我想是這樣的:

AbstractController = Ember.Object.extend({ 
// some methods with common logic 
}); 

AbstractArrayController = AbstractController.extend({}); 
AbstractObjectController = AbstractController.extend({}); 

的問題是我還需要AbstractArrayController和AbstractObjectController從他們的父母擴展(恩伯.ArrayController和Ember.ObjectController)。

我該如何實現這種繼承?

我在看重新開放,並reopenClass方法,現在,也許他們可能是有用的:http://emberjs.com/api/classes/Ember.Object.html#method_reopen

我嘗試了做這樣的事情:

Ember.Object.reopenClass({ 

    foo: function() { 
     return "foo"; 
    }.property("foo") 

}); 

但是,這似乎並沒有工作。

另一種方式把問題:

App.HelloController = Ember.ObjectController.extend({ 

    foo: function() { 
     return "foo"; 
    }.property("foo") 

}); 

App.WorldController = Ember.ObjectController.extend({ 

    foo: function() { 
     return "foo"; 
    }.property("foo") 

}); 

如何抽象foo的計算性能?

+0

你試過延伸Ember的控制器,並通過一個混合添加你的代碼? – Thomas

+0

@Thomas我不知道mixin。我只是試了一下,它的工作原理;)謝謝。你能把它作爲答案發布嗎? Mixins似乎是這類問題的正確解決方案。 –

回答

6

reopenClass在類對象上添加方法,而不是實例對象。當您這樣做時:

Ember.Object.reopenClass({ 
    foo: function() { 
    return "foo"; 
    }.property("foo") 
}); 

您正在創建Ember.Object.foo()

如果您想要在實例級別使用方法,例如Ember.Object.create().foo(),則需要使用reopen

要回答你的問題,抽象多種類型的對象可以使用的函數的最佳方式是使用mixin。創建一個你使用的mixin。

var mixin = Ember.Mixin.create({ 
    foo: function() { 
    return 'foo'; 
    } 
}); 

而且有你的對象採取混入你可以使用的優勢。

var MyController = Ember.ObjectController.extend(mixin, { 
    // ... 
}); 

更多的混入:http://codingvalue.com/blog/emberjs-mixins/http://emberjs.com/api/classes/Ember.Mixin.html