Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/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 如何在没有包装器的情况下将Backbone.View.el绑定到模板?_Javascript_Backbone.js - Fatal编程技术网

Javascript 如何在没有包装器的情况下将Backbone.View.el绑定到模板?

Javascript 如何在没有包装器的情况下将Backbone.View.el绑定到模板?,javascript,backbone.js,Javascript,Backbone.js,这是我正在使用的模板 <script type="text/template" id="template-message"> <p class="message"><%= message %></p> </script> 我如何使用它 var msg = new Message({message: "hello"}), view = new MessageView({model: msg}); $("body").ap

这是我正在使用的模板

<script type="text/template" id="template-message">
  <p class="message"><%= message %></p>
</script>
我如何使用它

var msg  = new Message({message: "hello"}),
    view = new MessageView({model: msg});

$("body").append(view.render().el);
输出

<body>
  <div>
    <p class="message">
      hello
    </p>
  </div>
</body>

我知道在我看来这是可能的

var MessageView = Backbone.View.exntend({
  tagName: "p",
  className: "message",
  // ...
});
最终用户将定义模板,因此我不希望在主干中指定这些内容。查看源代码


如何获得所需的输出并将视图绑定到html?

多亏@Gohn67的评论,我才能够实现这一点

var MessageView = Backbone.View.extend({

  template: _.template(Backbone.$("#template-message").html()),

  initialize: function() {
    this.setElement(this.template(this.model.attributes));
  }

});
如果我们看一下,我们可以看到它
setElement
做了我们想要它做的一切

// backbone source code
setElement: function(element, delegate) {
  if (this.$el) this.undelegateEvents();
  this.$el = element instanceof Backbone.$ ? element : Backbone.$(element);
  this.el = this.$el[0];
  if (delegate !== false) this.delegateEvents();
  return this;
},
它甚至可以处理事件委托。酷


我最近不得不在jQuery1.3.2上实现这一点Gross,我知道,但这只是一个简单的修复

唯一改变的部分是
setElement

  initialize: function() {
    this.setElement(
      $( this.template(this.model.attributes) )
    );
  }

模板
结果必须包装在
$()
中才能工作。我知道,考虑到主干网已经在尝试自动完成这项工作,这没有多大意义。这是我唯一能让它与jQuery 1.3.2一起工作的方法。

您也可以使用(我已经编写)并定义
el
属性,如
标记名
类名
等,作为模板中的数据属性。请参阅。

强制最终用户扩展BaseMessageView。最终用户将只定义HTML模板。他们没有创建JS源文件。显然你可以使用
setElement
。请看这里@Gohn67,谢谢你的指点。在你的帮助下,我提交了这个问题的答案。
// backbone source code
setElement: function(element, delegate) {
  if (this.$el) this.undelegateEvents();
  this.$el = element instanceof Backbone.$ ? element : Backbone.$(element);
  this.el = this.$el[0];
  if (delegate !== false) this.delegateEvents();
  return this;
},
  initialize: function() {
    this.setElement(
      $( this.template(this.model.attributes) )
    );
  }