烬控制器和“虚拟”和/或“abstract"方法

Ember Controllers and "virtual" and/or "abstract" methods?

本文关键字:quot abstract 方法 控制器 虚拟      更新时间:2023-09-26

我知道JS并不是为了"干净地"处理每个OOP的继承而设计的,但我想知道Ember是否有办法做到这一点。

在Ember中,我认为Ember.ObjectController.extend({...});是某种程度上的继承,但不是完全继承——我们当然可以添加我们自己的属性和方法,因此函数.extend({...}),但我们不能"覆盖"已经存在的函数。我想知道是否有这样的解决方法。

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

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做得很好,你只是不重写它,它击中基本实现。或者你重写它,它会清除基本实现。(这基本上是如何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