2014-09-30 5 views
5

ich vorher die Schaffung entdeckt es möglich ist, Mixins zu verlängern, wenn eine neue mixin wie solche zu schaffen:Wie würde man mehrere Mixins verlängern, wenn eine neue mixin in Ember.js

App.SomeNewMixin = Ember.Mixin.create(App.SomeOldMixin, { 
    someMethod: function() { return true; } 
}); 

Jetzt bin ich versucht, zwei zu verwenden, bestehende Mixins, aber Mixin.create scheint nur 2 Parameter zu unterstützen.

App.SomeNewMixin = Ember.Mixin.create(App.SomeOldMixinOne, App.SomeOldMixinTwo, { 
    someMethod: function() { // No access to methods defined in SomeOldMixinOne } 
}); 

Dies scheint eine ernste Einschränkung der Ember Mixins. Die Ember-Docs haben wenig oder gar nichts von Ember.Mixin, also bin ich mir nicht sicher, wie ich vorgehen soll. Ich habe versucht, Ember.Mixin.apply innerhalb der Init-Funktion von SomeNewMixin zu verwenden, auch ohne Erfolg.

App.SomeNewMixin = Ember.Mixin.create({ 
    init: function() { 
    this._super(); 
    this.apply(App.SomeOldMixinOne); 
    this.apply(App.SomeOldMixinTwo); 
    } 

    someMethod: function() { return true; } 
}); 

Jeder Einblick auf mögliche Lösungen würde sehr geschätzt werden!

Antwort

8

Das Erstellen eines Mixins, der mehrere andere Mixins erweitert, sollte gut funktionieren.

Zum Beispiel sehen Sie dies:

var App = Ember.Application.create(); 

App.SomeOldMixin = Ember.Mixin.create({ 
    someOldMethod: function() { return 'old'; }, 
    someOldMethod2: function() { return 'old2'; } 
}); 

App.SomeNewMixin = Ember.Mixin.create({ 
    someNewMethod: function() { return 'new'; } 
}); 

App.SomeNewerMixin = Ember.Mixin.create({ 
    someNewerMethod: function() { return 'newer'; } 
}); 

App.SomeNewestMixin = Ember.Mixin.create(App.SomeOldMixin, App.SomeNewMixin, App.SomeNewerMixin, { 
    someOldMethod: function() { 
    return this._super() + ' ' + this.someOldMethod2(); 
    }, 
    someNewestMethod: function() { return 'newest'; } 
}); 

App.ApplicationController = Ember.Controller.extend(App.SomeNewestMixin, { 
    test: function() { 
    console.log(this.someOldMethod()); 
    console.log(this.someNewMethod()); 
    console.log(this.someNewerMethod()); 
    console.log(this.someNewestMethod()); 
    }.on('init') 
}); 
+0

Die JSBin ist veraltet, könnten Sie bitte ein Snippet zu Ihrer Antwort hinzufügen? Vielen Dank! –