заставить backbone.js 'fetch' автоматически обновлять представление

Я пытаюсь выполнить элементарную задачу с Backbone.js и не могу заставить ее работать. Я просто хочу выполнить операцию fetch для моей модели и обновить представление. Вот мой код:

(function($) {
    var HomeModel = Backbone.Model.extend({
        defaults: {
            lead: "not logged in",
        },
        url: 'test.php'
    });

    var HomeView = Backbone.View.extend({
        initialize: function() {
            this.model = new HomeModel();
            this.model.bind("change", this.render);
            this.model.fetch();
        },

        el: $("#content"),

        render: function() {
            this.$el.html(this.model.get("lead"));
        }
    });

    var homeView = new HomeView();
})(jQuery);

Я вижу, что "test.php" загружается успешно, но функция render никогда не вызывается.

Что мне не хватает?


person McGarnagle    schedule 28.05.2012    source источник


Ответы (2)


Как вы увидели, что "test.php" успешно загружен? Может быть, запрос AJAX выполнен успешно, но ответ не является допустимым JSON? Попробуйте добавить обратные вызовы успеха и ошибки в вызов выборки: this.model.fetch({success: function (resp) { console.log('success: %o', resp) }, error: function (er) { console.log('error: %o', er) });

person theotheo    schedule 29.05.2012
comment
Я должен был знать. Спасибо! - person McGarnagle; 29.05.2012

Думаю, у меня есть правильный ответ. Вы имеете в виду this в своей функции render, но контекстом this является событие, а не ваш класс. Поэтому вы должны использовать функцию подчеркивания bindAll для привязки класса к внутренним компонентам функции. Вот так:

var HomeView = Backbone.View.extend({
    initialize: function() {
        _.bindAll(this, 'render'); // bind 'this' in 'render'
        this.model = new HomeModel();
        this.model.bind("change", this.render);
        this.model.fetch();
    },
});

В противном случае this.el не существует, или, по крайней мере, он неверен и тихо выходит из строя.

person Mosselman    schedule 28.05.2012
comment
Это тот же результат. (Я заметил, что bind все еще работает в других контекстах.) - person McGarnagle; 29.05.2012
comment
Хм извините за это. У вас есть jsfiddle или что-то, с чем мы можем поиграть? - person Mosselman; 29.05.2012