Javascript 主干应用程序:无法获取视图中的模型数据

Javascript 主干应用程序:无法获取视图中的模型数据,javascript,json,backbone.js,underscore.js,Javascript,Json,Backbone.js,Underscore.js,我正在构建我的第一个相对简单的主干应用程序。现在,它正在获取本地天气信息的JSON: Weather = Backbone.Model.extend({ url: '/api/v1/weather', initialize: function(){ this.fetch({ success: this.fetchSuccess, error: this.fetchError }); },

我正在构建我的第一个相对简单的主干应用程序。现在,它正在获取本地天气信息的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);
    }

});
视图的控制台日志是空对象{}。我尝试使用这个.model.get'timezone'的结果是未定义的

当我使用console.logthis.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数据似乎在模型的“attributes”对象中,但我不知道它为什么在那里,也不知道如何访问它

明确地说,当我执行console.logthis.model.toJSON;我得到一个空对象{}

我觉得我错过了一些明显的东西,我需要任何和所有的帮助。我做错了什么?返回的JSON数据的结构是否可能导致这种情况?这是来自Forecast.io API的非常标准的响应

如果您需要更多代码/信息,请告诉我

编辑:

在一些帮助下,我解决了这个问题。原来这就是罪魁祸首:this.model.bind'reset',this.render;。将其更改为this.model.bind'change',this.render;已修复该问题。

是正确的

如果你这样写:

console.log(this.model);
若要获取模型的实例,则解析的每个属性都在属性中

相反,如果你使用

console.log(this.model.toJSON());
var template = _.template(weatherTemplate, { weather : this.model.toJSON() });
将模型实例转换为json,可以直接获取属性,而无需传递属性

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

如果您使用:

var template = _.template(weatherTemplate, { weather : this.model });
在模板内部,您需要以以下方式打印var:

weather.attributes.timezone;
weather.timezone;
相反,如果你使用

console.log(this.model.toJSON());
var template = _.template(weatherTemplate, { weather : this.model.toJSON() });
在模板内部,您需要以以下方式打印var:

weather.attributes.timezone;
weather.timezone;

我已经试过了,我得到的只是一个空对象{}。谢谢你的回复。。。我试过了,但得到了未捕获的TypeError:无法读取未定义的属性'timezone'。调用this.model.toJSON似乎会导致一个空对象。1 fetch是一个AJAX调用,因此您没有理由相信在尝试使用该模型时会填充该模型。2 console.log将实时引用放入控制台,而不是快照。当您查看它时,AJAX调用已经从服务器返回。3 Modelfetch不会触发“重置”事件,它会触发“更改”事件。4 Collectionfetch仅在您为其提供reset:true选项时触发“重置”事件。我确信这个问题是重复的,所以我只是在评论。谢谢你的回答。我不清楚您在第1点中的意思,但感谢您提供有关模型获取不会触发重置事件的信息。解决这个问题实际上解决了我的问题。此外,在发布之前,我搜索了很多关于这个问题的答案,但没有发现任何适用于我的问题的答案。在进行AJAX调用时,您将向remove服务器发送请求,并在稍后获得响应。