Javascript Backbone.js-在哪里定义视图帮助程序?

Javascript Backbone.js-在哪里定义视图帮助程序?,javascript,model-view-controller,backbone.js,Javascript,Model View Controller,Backbone.js,最近几周,我一直在踢Backbone.js的轮胎,玩了一场游戏,所以有一个小问题 在backbone.js中定义和使用视图帮助程序的“正确”方法是什么 据我所知,在模板中定义要使用的帮助程序的唯一实际位置是模型或集合本身。然而,当那个助手直接返回HTML时,这就开始感觉有点脏了 有更好的方法吗?我将视图助手与Backbone.js放在几个不同的地方: 如果辅助对象特定于某个视图,请将其放在视图定义中: var MyView = Backbone.View.extend({ tagName:

最近几周,我一直在踢Backbone.js的轮胎,玩了一场游戏,所以有一个小问题

在backbone.js中定义和使用视图帮助程序的“正确”方法是什么

据我所知,在模板中定义要使用的帮助程序的唯一实际位置是模型或集合本身。然而,当那个助手直接返回HTML时,这就开始感觉有点脏了


有更好的方法吗?

我将视图助手与Backbone.js放在几个不同的地方:

如果辅助对象特定于某个视图,请将其放在视图定义中:

var MyView = Backbone.View.extend({
  tagName: 'div',

  events: {
    ...
  },

  initialize: function() { ... },

  helperOne: function() {
    // Helper code
  },

  anotherHelper: function() {
    // Helper code
  },

  render: function() { 
    ... this.helperOne() ...
  }
});
_.extend(Backbone.View.prototype, {
  helper: function() {
    // Helper code
  }
}
var MyOtherView = MyView.extend({

  // ...

  render: function() { 
    ... this.helperOne() ...
  }
});
如果辅助对象将由所有视图使用,请扩展主干视图类,以便所有视图都继承此函数:

var MyView = Backbone.View.extend({
  tagName: 'div',

  events: {
    ...
  },

  initialize: function() { ... },

  helperOne: function() {
    // Helper code
  },

  anotherHelper: function() {
    // Helper code
  },

  render: function() { 
    ... this.helperOne() ...
  }
});
_.extend(Backbone.View.prototype, {
  helper: function() {
    // Helper code
  }
}
var MyOtherView = MyView.extend({

  // ...

  render: function() { 
    ... this.helperOne() ...
  }
});
如果需要在视图之间共享更复杂的帮助程序,请让视图相互扩展:

var MyView = Backbone.View.extend({
  tagName: 'div',

  events: {
    ...
  },

  initialize: function() { ... },

  helperOne: function() {
    // Helper code
  },

  anotherHelper: function() {
    // Helper code
  },

  render: function() { 
    ... this.helperOne() ...
  }
});
_.extend(Backbone.View.prototype, {
  helper: function() {
    // Helper code
  }
}
var MyOtherView = MyView.extend({

  // ...

  render: function() { 
    ... this.helperOne() ...
  }
});

我不确定什么是最佳实践(或者是否有既定的最佳实践),但这些模式看起来相当干净且运行良好。

当您构建更大的主干应用程序时,您可能会希望为所有内容命名名称空间。然后,您将有一个全球助手的位置。我还没有完成完美的名称空间设置。但现在我正在做这样的事情:

brainswap:{
  appView: {},          <== Reference to instantiated AppView class.
  classes = {           <== Namespace for all custom Backbone classes.
    views : {},
    models : {},
    collections: {},
    controllers : {},
    Router: null
  },
  models: {},          <== Instantiated models.
  controllers: {},     <== Instantiated controllers.
  router: {},          <== Instantiated routers.
  helpers: {},         <== Reusable helper platform methods.
  currentView: {},     <== A reference to the current view so that we can destroy it.
  init: function(){}   <== Bootstrap code to start app.
}
brainswap.classes.views.profile.contact = brainswap.classes.views.profile.base.extend({...
“我的控制器”是实例化新视图的对象(并在
currentView
中放置一个引用)。请记住,您应该始终删除上一个视图,以便以前的视图事件都取消绑定,并减少内存使用。

快速解决方案(CoffeeScript)

然后您可以在视图中使用它:

Yourcoolapp.Views.ThingsIndex extends Backbone.view

  initialize: ->
    @template = this.handlebarsTemplate("#hb_template")
    # etc...

  someMethod: =>
    @template = this.handlebarsTemplate("#hb_other")

也可以进行mixin(即根据需要从类集合中获取类“mixin”方法),甚至可以进行面向方面的编程(单个函数调用覆盖类集合,用另一个方法包装目标方法).Hmm,在
extend
中使用
this
对我不起作用,但是
这个
确实起作用了。
这个
这个
方法不应该只使用
这个
?例如
这个.myMethod()
而不是
这个
。对我来说,后者有效,但前者失败。谢谢你,现在我知道如何扩展主干视图类,我可以删除大量重复的函数。太棒了,我发现自己编写了很多重复的辅助函数,我肯定会使用第二种方法,但是你能举个例子说明你在哪里使用它吗使用你展示的第三种方法?