在 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
我的 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