【问题标题】:Extend Coffeescript subclass function from parent in marionette从木偶中的父级扩展 Coffeescript 子类函数
【发布时间】: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),但我需要它是一个函数。

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

【问题讨论】:

    标签: javascript backbone.js coffeescript marionette


    【解决方案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(或您所称的任何名称)属性。
      猜你喜欢
      • 1970-01-01
      • 2013-01-26
      • 2011-07-14
      • 2012-02-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多