在 marionette 中从父类扩展 Coffeescript 子类函数

Extend Coffeescript subclass function from parent in marionette

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

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

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

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

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

在Backbone中,当你从另一个class继承时,Backbone会给subclass一个__super__属性(double两端有下划线),这是父级class的原型。所以在你的 Views.NewUser class 中,你可以通过 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()

假设当您说 "parent" 时,您指的是 "parent view" 而不是 OO 祖先。 您可以通过执行以下操作来实现您想要实现的目标: 1. 使用 itemViewOptions(或较新的 Marionette 中的 childViewOptions)将数据对象从父视图传递到子视图。它可以包含函数。 2. 在您的子视图中,您可以执行以下操作:


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