Backbone.js - 在哪里定义视图助手?

时间:2011-09-03 14:28:21

标签: javascript model-view-controller backbone.js

我一直在踢Backbone.js的轮胎并且在最近几周玩耍,所以有点像菜鸟问题......

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

据我所知,定义帮助器在模板中使用的唯一真实位置是模型或集合本身。但是,当该帮助程序直接返回HTML时,这开始感觉有点脏。

有更好的方法吗?

3 个答案:

答案 0 :(得分:42)

我在Backbone.js中添加了一些不同的视图助手:

如果帮助程序特定于某个视图,请将其放在视图定义中:

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

  events: {
    ...
  },

  initialize: function() { ... },

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

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

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

如果所有视图都使用帮助程序,请扩展Backbone View类,以便所有视图都继承此函数:

_.extend(Backbone.View.prototype, {
  helper: function() {
    // Helper code
  }
}

如果您需要在视图之间进行更复杂的帮助程序共享,请让视图相互扩展:

var MyOtherView = MyView.extend({

  // ...

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

我不确定什么是最佳做法(或者如果已经建立了最佳做法),但这些模式看起来相当干净且运作良好。

答案 1 :(得分:0)

当您构建更大的Backbone应用程序时,您可能想要命名一切。然后你将有一个全球帮手的地方。我还没有完成完美的命名空间设置。但是现在我正在做这样的事情:

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中放置一个引用。请记住,您应该始终删除上一个视图,以便先前的视图事件全部解除绑定并减少内存使用。

答案 2 :(得分:0)

快速解决方案(CoffeeScript)

Backbone.View::handlebarsTemplate = (templateName) ->
  Handlebars.compile $(templateName).html()

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

Yourcoolapp.Views.ThingsIndex extends Backbone.view

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

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