从木偶中的父级扩展 Coffeescript 子类函数

Posted

技术标签:

【中文标题】从木偶中的父级扩展 Coffeescript 子类函数【英文标题】:Extend Coffeescript subclass function from parent in marionette 【发布时间】:2015-09-06 04:08:59 【问题描述】:

我的 Marionette 应用程序中有一个“FormView”类,它为我的应用程序周围的表单提交设置了很多东西。每次有表格时我都会使用它。我还有一些助手,我想通过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),但我需要它是一个函数。

有可能吗?如果有,怎么做?

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

【参考方案2】:

在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()

【讨论】:

这很有趣,但如果我能够以某种方式从 PARENT 类扩展它,我仍然更喜欢它。只是因为我知道当我创建一个新实例时我会忘记从子类扩展它。 据我所知,您不能从父类内部扩展子类(以任何语言)。此外,initialize 方法将在您创建子类的新实例时自动调用,因此如果您在该方法中执行_.extend,则不必记住这样做。您可以立即使用@helpers(或您所称的任何名称)属性。

以上是关于从木偶中的父级扩展 Coffeescript 子类函数的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法从VueJS中的父级触发组件方法?

如何从 TypeScript 文件中的父级获取子组件变量和函数

(QNativeSocketEngine)QObject:无法为不同线程中的父级创建子级

将节中的列表样式从节的父级删除后带回

在 show() 之前获取 DialogFragment 子类中的父活动

将绑定传递回父级的父级视图