在我看來,問題是具有視圖的渲染方法返回的視圖。
你的看法可能看起來是這樣的:
var Someview = Backbone.View.extend({
initialize: function() {
this.template = _.template($("#someview-template"));
this.model.on('change', this.render());
},
render: function() {
var html = this.template(this.model);
this.$el.html(html);
return this;
}
});
然後放到你有一個創建視圖,並將其附加到DOM的方法。
var $main = $('#main'); //main area in the DOM eg: <div id="main"></div>
$main.append(new Somveview({model: item}).render().$el);
的問題是,渲染()必須被調用來訪問視圖的元素... 想一想,當一個變化的看法是要再次渲染模型製作。 這意味着如果您想要添加任何轉場效果,例如淡入淡出或滑動您可能會將其添加到視圖的呈現方法中。
添加一些影響到的意見渲染方法。
var Someview = Backbone.View.extend({
initialize: function() {
this.template = _.template($("#someview-template"));
this.model.on('change', this.render());
},
render: function() {
var html = this.template(this.model);
this.$el.html(html).hide().slideDown(600);
return this;
}
});
這樣做,對模型的任何更改都會導致視圖呈現,並且我們將看到滑落效果。但只是因爲視圖已經被添加到DOM!問題是,我們注意到頁面加載時不會發生slideDown效應。因此,作爲補丁,我們在創建視圖的位置複製效果並將其附加到DOM。
爲什麼效果不會在頁面加載發生的原因是因爲效果已經發生了,我們附加視圖的DOM元素之前。
但爲什麼複製的效果,這是有道理的,以我改變看法了一點。
var Someview = Backbone.View.extend({
initialize: function() {
this.template = _.template($("#someview-template"));
this.model.on('change', this.render());
},
render: function() {
var html = this.template(this.model);
this.$el.html(html);
//no longer returning the views object from the render method.
}
});
創建視圖,並追加到DOM
var $main = $('#main'); //main area in the DOM eg: <div id="main"></div>
var someview = new Somveview({model: item}); //create the view
$main.append(someview.$el); // add the view's element to the DOM
someview.render(); // Rendering after we have appended to the DOM !!
感謝您的快速修復,這完美的作品。 – 2012-02-14 16:12:56
我不得不做一些不同的事情,但是謝謝你讓我看到了@Linus。 – sehummel 2013-02-06 23:15:17
像一個魅力工作 – 2013-07-26 02:49:19