3
App.CurtainView = Ember.View.extend
  name: "CurtainView"
  getName: ->
    console.log @get("name")

App.ButtonView = App.CurtainView.extend
  name: "ButtonView"
  getName: ->
    # Do something
    @_super()

控制台返回:

ButtonView

...但我希望:

CurtainView

我想这是一个上下文问题 - 我如何使用父对象上下文制作 _super() ?

4

1 回答 1

2

我没有完全达到你的目标。这种行为与您对 Ruby 语言所期望的行为相同,但确实与您使用 Java 获得的行为不同(假设您将name在子类中重新定义属性Button ......

实际上,您必须了解 Ember 的对象模型的实现方式才能更好地理解您得到的行为:

App = Ember.Application.create();

App.CurtainView = Ember.View.extend({
  name: "CurtainView",
  getName: function() {
    console.log(this.get("name"));
  }
});

App.ButtonView = App.CurtainView.extend({
  name: "ButtonView",
  getName: function() {
    this._super();
  }
});

var c = App.CurtainView.create(),
    b = App.ButtonView.create();

console.log(c.getName.toString());
console.log(b.getName.toString());

c.getName();
b.getName();
b.getName.apply(c);

默认情况下,_super调用适用于调用当前函数的对象。

getName您可以通过调用applyorcall并传递适当的目标来覆盖此默认行为。但对我来说这似乎很奇怪......

JSFiddle在这里

于 2012-10-09T12:06:45.687 回答