Javascript Backbone.js-在哪里定义视图帮助程序?
最近几周,我一直在踢Backbone.js的轮胎,玩了一场游戏,所以有一个小问题 在backbone.js中定义和使用视图帮助程序的“正确”方法是什么 据我所知,在模板中定义要使用的帮助程序的唯一实际位置是模型或集合本身。然而,当那个助手直接返回HTML时,这就开始感觉有点脏了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放在几个不同的地方: 如果辅助对象特定于某个视图,请将其放在视图定义中:
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()
而不是这个
。对我来说,后者有效,但前者失败。谢谢你,现在我知道如何扩展主干视图类,我可以删除大量重复的函数。太棒了,我发现自己编写了很多重复的辅助函数,我肯定会使用第二种方法,但是你能举个例子说明你在哪里使用它吗使用你展示的第三种方法?