Шаблонная модель 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 и будет готов к использованию.

Другие вопросы по тегам