Backbone ::在视图上使用jQuery插件

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函数内部,它将看起来很难看.

那么,最好的方法是什么?

Der*_*ley 6

答案在很大程度上取决于你所谈论的插件.

例如,大多数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

当然,除了这个附加组件之外,还有很多其他功能.