Как изменить значение атрибута в одном методе и извлечь его в другом методе в модели backbone.js? - PullRequest
0 голосов
/ 19 марта 2012

Это моя модель:

var AppModel = Backbone.Model.extend({
    defaults : {
        xmlDeclarationAndDoctype : ''
    },

    renderFoobar : function () {
        this.set({'xmlDeclarationAndDoctype' : 'foobar'});
        this.fetchFoobar();
    }, 
    fetchFoobar : function () {
        console.log(this.get('xmlDeclarationAndDoctype'));
    }, 
    fetchAgain : function () {       
       console.log(this.get('xmlDeclarationAndDoctype'));
    }
});

My View:

window.AppView = Backbone.View.extend({
    initialize : function () {
        model = new AppModel({});
    }, 

    render : function () {
        model.renderFoobar();
    }
});

Когда я вызываю следующий код на моей HTML-странице, я получаю 'foobar', когда страница отображается.

$(window).load(function () {
   var appView = new AppView;
});

На этой странице после нажатия кнопки я вызываю функцию, которая имеет следующий код, но на этот раз я получаю пустую строку вместо 'foobar'.

model = new AppModel({});
model.fetchAgain();

Что не так в коде выше?

ОБНОВЛЕНИЕ:

мю слишком короткий дал правильный ответ, спасибо, тонна !. Я просто хотел бы добавить выдержку из правильного ответа, приведенного ниже.

new AppModel({}) в AppView # initialize отличается от new AppModel({}) в другом месте.

Демо: http://jsfiddle.net/sjagf/2/

1 Ответ

3 голосов
/ 19 марта 2012

new AppModel({}), который вы создаете в AppView#initialize, отличается от new AppModel({}), который вы создаете в обработчике вашей кнопки. Вы просматриваете свойство xmlDeclarationAndDoctype двух разных моделей и получаете два разных результата.

Вызов new AppModel(o), для некоторого набора опций o, дважды не даст вам один и тот же объект. Backbone не отслеживает все объекты, которые он создал, это ваша работа или работа вашей коллекции. Если вы посмотрите на cid ваших моделей, вы увидите:

http://jsfiddle.net/ambiguous/sjagf/

Возможно, вам нужна коллекция , которая поможет вам отслеживать ваши модели.

У вас больше проблем. Ваше представление использует глобальную переменную, model:

window.AppView = Backbone.View.extend({
    initialize : function () {
        model = new AppModel({}); // This is a global
    }, 

и это, вероятно, перезаписывается в вашем обработчике кнопок. Вы должны прикрепить model к this:

window.AppView = Backbone.View.extend({
    initialize : function () {
        this.model = new AppModel({});
    }, 

    render : function () {
        this.model.renderFoobar();
    }
});

Или, может быть, так:

window.AppView = Backbone.View.extend({
    render : function () {
        this.model.renderFoobar();
    }
});

// And elsewhere...
var v = AppView.new({ model: new AppModel({}) });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...