灰烬控制器和“虚拟”和/或“抽象”方法?

时间:2014-06-12 14:36:14

标签: javascript oop inheritance ember.js controller

我知道JS并不是为了按照OOP"干净利落地处理继承而设计的,但我不知道Ember是否有办法解决这个问题。

在Ember中,我认为Ember.ObjectController.extend({...});在某种程度上是继承,但并非完全 - 我们肯定可以添加我们自己的属性和方法,因此函数.extend({...}),但我们可以&#39}# 34;覆盖"已存在的功能。我想知道是否有这样的解决方法。

如果我创建了一个基本控制器,我该如何定义我希望子控制器实现的功能?我有基本控制器(仅限理论代码):

App.BaseController = Ember.ObjectController.extend({
     // Methods meant for a child controller to implement 
     abstractMethod1: null,
     abstractMethod2: null,
     virtualMethod1: function(){
         ...
     },
     actions: {
        execute: function(){
             if(this.get("abstractMethod1"))
                 this.get("abstractMethod1")();
             ...
             if(this.get("abstractMethod2")
                 var x = this.get("abstractMethod2")();
        }
    }
});

然后我有一个实现控制器试图覆盖这些功能:

App.ImplementingController = App.BaseController.extend({
    /* How would I implement abstractMethod1 and abstractMethod2 here!?
       For virtualMethod1, how would I call something like base.virtualMethod1()
       or super.virtualMethod1()?
    */
});

我发现自己创建了大量具有基本相同代码的控制器,除了模型的名称及其属性。能够在Ember中推出这个方案会很高兴。怎么办?

1 个答案:

答案 0 :(得分:1)

实际上Ember做得非常好,你只是不要覆盖它并且它击中了基础实现。或者你确实覆盖了它,它会摧毁基础实现。 (这实际上是Mixins的工作方式,http://emberjs.com/api/classes/Ember.Mixin.html)如果你想点击base函数,属性等,它只是用它来访问它(它实际上将两个类一起打碎,优先于扩展课程。

App.BaseController = Ember.ObjectController.extend({
  a:'Base',
  b:'Base',
  acomp: function(){
    return 'Base';
  }.property(),
  bcomp: function(){
    return 'Base';
  }.property(),
  e:function(){
    return 'Base';
  },
  f:function(){
    return 'Base';
  }
});

扩展

App.IndexController = App.BaseController.extend({
  b:'Index',
  c:'Index',
  bcomp: function(){
    return 'Index';
  }.property(),
  f:function(){
    return 'Index';
  },
  actions:{
    foo:function(){
      console.log(this.e());
      console.log(this.f());
    }
   }
});

Ember将它们组合后的样子

App.IndexController....
      a:'Base'
      b:'Index',
      c:'Index',
      acomp: function(){
        return 'Base';
      }.property(),
      bcomp: function(){
        return 'Index';
      }.property(),
      e:function(){
        return 'Base';
      },
      f:function(){
        return 'Index';
      },
      actions:{
        foo:function(){
          console.log(this.e());
          console.log(this.f());
        }
       }
    });

http://emberjs.jsbin.com/wuhuleje/2/edit