Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 主干::在视图上使用jQuery插件_Javascript_Jquery_Backbone.js - Fatal编程技术网

Javascript 主干::在视图上使用jQuery插件

Javascript 主干::在视图上使用jQuery插件,javascript,jquery,backbone.js,Javascript,Jquery,Backbone.js,我很难想出一个干净的方法来做这件事。让我们以主干网附带的示例todo应用程序的代码片段为例: addOne: function(todo) { var view = new TodoView({model: todo}); $("#todo-list").append(view.render().el); }, 所以ToDo视图被呈现,然后被附加到#ToDo列表中。但是假设我们想在ToDo视图中添加一个jQuery插件。我们应该把$(“.todo”).plugin()放在哪里?如果我们

我很难想出一个干净的方法来做这件事。让我们以主干网附带的示例todo应用程序的代码片段为例:

addOne: function(todo) {
  var view = new TodoView({model: todo});
  $("#todo-list").append(view.render().el);
},
所以ToDo视图被呈现,然后被附加到
#ToDo列表中。但是假设我们想在ToDo视图中添加一个jQuery插件。我们应该把
$(“.todo”).plugin()放在哪里?如果我们将它放在ToDo view render函数中,页面上不会设置HTML元素,因此插件不会“锁定”任何DOM元素。如果我们把它放在
addOne
函数中,它看起来会很难看


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

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

例如,大多数jQueryUI控件和KendoUI控件允许您在将HTML附加到DOM之前,直接从视图的
render
调用plugin方法。您只需在视图的
el
上调用它

例如,如果我想在生成以下内容的视图上使用KendoUI的菜单:


Backbone.View.extend({
  tagName: "ul",

  render: function(){
    var html = "<li>foo</li><li>bar</li>"; 
    this.$el.html(html);
    this.$el.kendoMenu();
  }
});
FWIW:我已经为onShow和其他常用方法和事件编写了几十次代码,并将其整合到一个称为主干网.木偶网的主干网附加组件中,这样我就不必再编写它了


当然,在这个附加组件中,有很多不仅仅是这样的功能。

您可以使用主干
$
方法,就像这样
这样。$('todo')
使用上下文范围的jquery查询,这将允许您在当前视图中搜索尚未添加到文档DOM树中的DOM片段


根据我在render方法或某种帮助函数中添加jquery插件绑定的经验,如果有更多自定义绑定,则在创建模板后将从render方法调用这些绑定。

这让我想起了以前的数学测试。我过去常常抹掉我的答案然后退出,因为我最终只能得到9.2345124,而这似乎是一个奇怪的数字,不可能是真的,所以我退出了。这里也是一样,我希望有一个干净的解决方案,但显然没有不过图书馆看起来很不错!旧的
setTimeout(function(){…},0)
hack是一种替代方法,通常在需要等待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();
}