我正在构建我的第一个相对简单的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);
可解决问题。
答案 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;