Cam*_*mel 2 javascript jquery backbone.js
我无法找到一个干净的方法来做到这一点.让我们举个例子来自骨干附带的示例todo应用程序的代码片段:
addOne: function(todo) {
var view = new TodoView({model: todo});
$("#todo-list").append(view.render().el);
},
Run Code Online (Sandbox Code Playgroud)
因此,正在渲染ToDo视图,然后将其附加到#todo-list.但是我们假设我们想在ToDo视图中添加一个jQuery插件.我们应该在哪里放置$(".todo").plugin()代码段?如果我们将它放在ToDo视图渲染函数中,则不会在页面上设置HTML元素,因此插件不会"锁定"任何DOM元素.如果我们将它置于addOne函数内部,它将看起来很难看.
那么,最好的方法是什么?
答案在很大程度上取决于你所谈论的插件.
例如,大多数jQueryUI控件和KendoUI控件允许您render在将HTML附加到DOM之前直接从视图中调用插件方法.你只需在视图上调用它el.
例如,如果我想在生成的视图上使用KendoUI的菜单:
Backbone.View.extend({
tagName: "ul",
render: function(){
var html = "<li>foo</li><li>bar</li>";
this.$el.html(html);
this.$el.kendoMenu();
}
});
Run Code Online (Sandbox Code Playgroud)
无论出于何种原因,有些插件要求HTML已经成为DOM的一部分.在这种情况下,我通常onShow在我的视图中提供一个函数,并使用显示视图的代码检查它并在其存在时调用它.
例如,有一个"布局"插件,我已经使用了几次.这个插件要求HTML在它可以工作之前成为DOM的一部分:
MyView = Backbone.View.extend({
render: function(){
var html = "generate some html here...";
this.$el.html(html);
},
onShow: function(){
this.$el.layout();
}
});
// .... some other place where the view is used
var view = new MyView();
view.render();
$("#someElement").html(view.el);
if (view.onShow) {
view.onShow();
}
Run Code Online (Sandbox Code Playgroud)
FWIW:我已经为onShow和其他常见的方法和事件编写了数十次代码,并将它们整合到一个名为Backbone.Marionette的Backbone附加组件中,这样我就不用再写它了.
http://github.com/derickbailey/backbone.marionette
当然,除了这个附加组件之外,还有很多其他功能.