Javascript 主干应用程序:无法获取视图中的模型数据
我正在构建我的第一个相对简单的主干应用程序。现在,它正在获取本地天气信息的JSON: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 }); },
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服务器发送请求,并在稍后获得响应。