Backbone app:无法在View中获取模型数据

时间:2014-05-04 16:45:54

标签: javascript json backbone.js underscore.js

我正在构建我的第一个相对简单的Backbone应用程序。现在,它正在获取当地天气信息的JSON:

Weather = Backbone.Model.extend({
    url: '/api/v1/weather',

    initialize: function(){
        this.fetch({
            success: this.fetchSuccess,
            error: this.fetchError
        });
    },

    parse: function(response) 
    {
        return response;
    },

    fetchSuccess: function (model, response) {
        console.log('FETCH SUCCESS:', response);
    },

    fetchError: function (model, response) {
        throw new Error("FETCH ERROR");
    }
});

上面似乎工作正常,因为fetchSuccess控制台日志按预期返回JSON响应。

当我尝试从视图中访问此数据时,会发生此问题。这是我的代码:

WeatherView = Backbone.View.extend({

    el: $('#widget__weather'),

    initialize: function() 
    {
        _.bindAll(this, 'render');

        this.model = new Weather();

        this.model.bind('reset', this.render);

        this.render();
    }, 

    render: function()
    {

        console.log(this.model.toJSON());

        // var template = _.template(weatherTemplate, { weather : this.model });

        // this.$el.html(template);
    }

});

视图的控制台日志为空Object { }。我尝试使用this.model.get('timezone')会导致undefined

当我console.log(this.model)时,我明白了:

  s {cid: "c3", attributes: Object, _changing: false, _previousAttributes: Object, changed: Object…}
    _changing: false
    _events: Object
    _pending: false
    _previousAttributes: Object
    attributes: Object
        currently: Object
        daily: Object
        flags: Object
        headers: Array[13]
        hourly: Object
        minutely: Object
        offset: -4
        timezone: "America/New_York"
    __proto__: Object
    changed: Object
    cid: "c3"
    __proto__: n

似乎我的JSON数据位于模型的“属性”对象中,但我不知道为什么它存在或如何访问它。

要清楚,当我console.log(this.model.toJSON());时,我会得到一个空的Object { }

我觉得我错过了一些明显的东西,可以使用任何和所有的帮助。我究竟做错了什么?返回的JSON数据的结构是否可能导致此问题?这是Forecast.io API的标准响应。

如果您需要更多代码/信息,请与我们联系。

编辑:

在一些帮助下我解决了这个问题。事实证明这是罪魁祸首:this.model.bind('reset', this.render);。将其更改为this.model.bind('change', this.render);可解决问题。

1 个答案:

答案 0 :(得分:0)

是的是正确的。

如果你这样写:

console.log(this.model);

您获取模型的实例,您解析的每个属性都在attributes内。

相反,如果您使用

console.log(this.model.toJSON());

您将模型的实例转换为json,您可以直接获取您的属性而不经过attributes

然后,如果您想在模板中打印数据,则需要执行以下操作:

如果您使用:

var template = _.template(weatherTemplate, { weather : this.model });

在模板内部,您需要以这种方式打印var:

weather.attributes.timezone;

相反,如果您使用

var template = _.template(weatherTemplate, { weather : this.model.toJSON() });

在模板内部,您需要以这种方式打印var:

weather.timezone;