在牵线木偶中从父级扩展Coffeescript子类函数

时间:2015-06-20 05:26:58

标签: javascript backbone.js coffeescript marionette

我有一个" FormView"我的Marionette应用程序中的类,它为我的应用程序周围的表单提交设置了很多东西。我每次有表格时都会用它。我还希望通过templateHelpers方法将一些帮助器传递给每个表单模板,但我也希望能够在子项中添加额外的templateHelpers。像这样:

class Views.FormView extends Marionette.ItemView
  templateHelpers: ->
    helpers: Marionette.Concerns.Helpers

class Views.NewUser extends Views.FormView
  templateHelpers: ->
    variable: @something

我希望能够从@variable的模板访问@helpersNewUser。另外,如果_.extends是一个对象,我知道如何处理这个问题(通过templateHelpers),但我需要它作为一个函数。

有可能吗?如果是这样,怎么样?

2 个答案:

答案 0 :(得分:4)

在Backbone中,当你从另一个类继承时,Backbone会给子类一个__super__属性(两端都是双下划线),这是父类的原型。因此,从Views.NewUser课程中,您可以通过View.NewUser.__super__获取原型。然后,您可以在该对象上调用templateHelpers。我是这样做的(live example at JSbin):

Views = {}

class Views.FormView extends Marionette.ItemView
  templateHelpers: ->
    helpers: "Parent Value"
  logHelpers: ->
    console.log @templateHelpers()

class Views.NewUser extends Views.FormView
  templateHelpers: ->
    variable: "Child Value"
  logHelpers: ->
    console.log @templateHelpers()
    console.log Views.NewUser.__super__.templateHelpers()


formView = new Views.FormView()

formView.logHelpers() // { helpers: "Parent Value" }

newUser = new Views.NewUser()

newUser.logHelpers()

// { variable: "Child Value" }, { helpers: "Parent Value" }

然后你可以使用_.extend将一个扩展到另一个;也许是这样的:

initialize: ->
    @helpers = _.extend @templateHelpers(),
        Views.NewUser.__super__.templateHelpers()

答案 1 :(得分:1)

假设当你说" parent"你的意思是"父母的观点"而不是OO的祖先。 您想要实现的目标可以通过执行以下操作来完成: 1.使用itemViewOptions(或更新的Marionette中的childViewOptions)将数据对象从父视图传递到子视图。它可以包含功能。 2.在子视图中,您可以执行以下操作:


templateHelpers: ->
  _.extend super(), @options.someOptionsFromParent