На мой взгляд, проблема заключается в том, что метод рендеринга представления возвращает представление.
Ваше мнение, вероятно, выглядит примерно так:
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 !!
Спасибо за быстрое решение, это работает отлично. –
Я должен был сделать что-то другое, но спасибо, что показал мне путь, @Linus. – sehummel
работал как шарм –