Шаблонная модель canjs, которая еще не готова. Databinding
У меня проблема с рендерингом объекта, который не готов в тот момент, когда шаблон отображается. Таким образом, это рендеринг пустого представления без привязки данных.
Как правильно использовать отложенные объекты или какой-то другой метод для обеспечения привязки данных?
var Project = can.Model.extend({
findOne: 'GET /v1/project?id={id}'
})
var ProjectControl = can.Control.extend({
selectedProject: '',
init: function(el, options) {
/*Get data and initialize objects*/
var self = this;
Models.Project.findOne({
id: 3
}, function(project) {
self.selectedProject = project;
});
},
'route': function() {
/*root route*/
$('#projectView').html(can.view('projectViewTemplate', this.selectedProject));
}
})
var pc = new Controllers.ProjectControl('body');
can.route.ready();
window.location.hash = '#!'
Я попытался инициализировать selectedProject с пустой моделью, но это кажется немного дамп способ сделать это:
new Models.Project({name:'Empty project'}, phases:[]) //Dump way for doing the databinding
Также это не решит проблему, когда мне нужно использовать подобъекты проекта, такие как фазы проекта.
редактировать: я нашел довольно неловкий способ ожидания подобъекта проекта. Я связал обработчик для смены модели, так что теперь даже обновление работает. Есть ли более элегантный способ сделать это?
'edit/:id route': function(data) {
var data = data;
var self = this;
this.selectedProject.bind('name', function(ev) {
$('#projectView').html(can.view(self.defaults.phaseEditProject, {
'phase': self.selectedProject.phases[data.id],
}));
})
},
1 ответ
Сделай это:
init: function(el, options) {
/*Get data and initialize objects*/
var self = this;
self.selectedProject = Models.Project.findOne({
id: 3
}).done(function(project) {
self.selectedProject = project;
});
},
Передача deferred в can.view ждет, пока deferred разрешит, а затем использует его разрешенное значение. Впоследствии, если маршрут изменится, проект окажется в выбранном слоте Project и будет готов к использованию.