Backbone.js 提供全局 el 与在对象中传递它
Backbone.js providing global el vs passing it in object
我正在努力学习 Backbone.js,我对将 el 传递到视图对象或创建全局变量感到困惑。
我的意思是:
var CarsView = Backbone.View.extend({
tagName: "ul",
render: function(){
var self=this;
this.model.each(function(car){
var carView = new CarView({ model:car });
self.$el.append(carView.render().$el)
});
return this;
}
});
var cars = new Cars([
new Car({ id: 1, registrationNumber: "XLI887"}),
new Car({ id: 2, registrationNumber: "ZNP123"}),
new Car({ id: 3, registrationNumber: "XUV456"})
]);
var carsView = new CarsView({ el:"#container", model: cars });
当我这样做时,<ul>
没有创建,我必须将我的容器标签更改为 <ul>
。
所以我明白了:
<div id="songs">
<li id="1">Blue in Green</li>
<li id="2">So what </li>
<li id="3">All blues</li>
</div>
但是如果我这样做:
var CarsView = Backbone.View.extend({
tagName: "ul",
render: function(){
var self=this;
this.model.each(function(car){
var carView = new CarView({ model:car });
self.$el.append(carView.render().$el)
});
return this;
}
});
var cars = new Cars([
new Car({ id: 1, registrationNumber: "XLI887"}),
new Car({ id: 2, registrationNumber: "ZNP123"}),
new Car({ id: 3, registrationNumber: "XUV456"})
]);
var carsView = new CarsView({ model:cars });
$("#container").html(carsView.render().$el);
在检查元素时我得到这个:
<div id="container">
<ul>
<li id="1">XLI887<button class="delete">Delete</button></li>
<li id="2">ZNP123<button class="delete">Delete</button></li>
<li id="3">XUV456<button class="delete">Delete</button></li>
</ul>
</div>
这里是 mt CarView:
var CarView = Backbone.View.extend({
tagName: "li",
render: function(){
this.$el.html(this.model.get("registrationNumber"));
this.$el.append("<button>Delete</button>");
this.$el.attr("id", this.model.id);
return this;
}
});
一方面我得到了容器标签,另一方面我没有。我认为这可能是由于 el 作为全局而不是在视图对象中传递,但情况似乎并非如此。
当您像 { el:"#container"}
一样传递选项 el
时,您是在告诉 backbone 此视图实例的根元素是 DOM
中的现有元素,因此 backbone 不会创建根元素。
当你不传递el
选项时,backbone会为你创建一个Root元素(在内存中,还没有在DOM中),这是尊重其他人的时候tagName: "ul",
等选项,用于自定义它将为您创建的元素。
Imo 第二种方法将使您免于许多典型错误,因此您应该这样做,除非您真的真的想为 DOM 中的现有元素提供行为,例如服务器呈现的内容。
一些小改进:
var CarsView = Backbone.View.extend({
tagName: "ul",
render: function() {
this.collection.each(function(car) {
var carView = new CarView({
model: car
});
this.$el.append(carView.render().$el)
}, this);
return this;
}
});
var cars = new Cars([{
id: 1,
registrationNumber: "XLI887"
},
{
id: 2,
registrationNumber: "ZNP123"
},
{
id: 3,
registrationNumber: "XUV456"
}]);
var carsView = new CarsView({
collection: cars
});
$("#container").html(carsView.render().$el);
我正在努力学习 Backbone.js,我对将 el 传递到视图对象或创建全局变量感到困惑。 我的意思是:
var CarsView = Backbone.View.extend({
tagName: "ul",
render: function(){
var self=this;
this.model.each(function(car){
var carView = new CarView({ model:car });
self.$el.append(carView.render().$el)
});
return this;
}
});
var cars = new Cars([
new Car({ id: 1, registrationNumber: "XLI887"}),
new Car({ id: 2, registrationNumber: "ZNP123"}),
new Car({ id: 3, registrationNumber: "XUV456"})
]);
var carsView = new CarsView({ el:"#container", model: cars });
当我这样做时,<ul>
没有创建,我必须将我的容器标签更改为 <ul>
。
所以我明白了:
<div id="songs">
<li id="1">Blue in Green</li>
<li id="2">So what </li>
<li id="3">All blues</li>
</div>
但是如果我这样做:
var CarsView = Backbone.View.extend({
tagName: "ul",
render: function(){
var self=this;
this.model.each(function(car){
var carView = new CarView({ model:car });
self.$el.append(carView.render().$el)
});
return this;
}
});
var cars = new Cars([
new Car({ id: 1, registrationNumber: "XLI887"}),
new Car({ id: 2, registrationNumber: "ZNP123"}),
new Car({ id: 3, registrationNumber: "XUV456"})
]);
var carsView = new CarsView({ model:cars });
$("#container").html(carsView.render().$el);
在检查元素时我得到这个:
<div id="container">
<ul>
<li id="1">XLI887<button class="delete">Delete</button></li>
<li id="2">ZNP123<button class="delete">Delete</button></li>
<li id="3">XUV456<button class="delete">Delete</button></li>
</ul>
</div>
这里是 mt CarView:
var CarView = Backbone.View.extend({
tagName: "li",
render: function(){
this.$el.html(this.model.get("registrationNumber"));
this.$el.append("<button>Delete</button>");
this.$el.attr("id", this.model.id);
return this;
}
});
一方面我得到了容器标签,另一方面我没有。我认为这可能是由于 el 作为全局而不是在视图对象中传递,但情况似乎并非如此。
当您像 { el:"#container"}
一样传递选项 el
时,您是在告诉 backbone 此视图实例的根元素是 DOM
中的现有元素,因此 backbone 不会创建根元素。
当你不传递el
选项时,backbone会为你创建一个Root元素(在内存中,还没有在DOM中),这是尊重其他人的时候tagName: "ul",
等选项,用于自定义它将为您创建的元素。
Imo 第二种方法将使您免于许多典型错误,因此您应该这样做,除非您真的真的想为 DOM 中的现有元素提供行为,例如服务器呈现的内容。
一些小改进:
var CarsView = Backbone.View.extend({
tagName: "ul",
render: function() {
this.collection.each(function(car) {
var carView = new CarView({
model: car
});
this.$el.append(carView.render().$el)
}, this);
return this;
}
});
var cars = new Cars([{
id: 1,
registrationNumber: "XLI887"
},
{
id: 2,
registrationNumber: "ZNP123"
},
{
id: 3,
registrationNumber: "XUV456"
}]);
var carsView = new CarsView({
collection: cars
});
$("#container").html(carsView.render().$el);