对于我的生活,我无法弄清楚如何在我的模型中获得一些属性。
我定义了我的reportUrl模型:
var ReportUrl = Backbone.Model.extend({
urlRoot: '/api/report/test/'
});
然后在我看来,我像这样获取它,并将其添加到我的测试模型中。注意 - 它只为每个测试提取一个URL:
var reportUrl = new ReportUrl({ id: test.id });
reportUrl.fetch();
test.set({
reportUrl: reportUrl
});
var view = new reportUrlView({
model: test
});
如果我把它写出来,我可以在浏览器控制台中看到它(见下面的截图)。我只是无法弄清楚如何访问我需要的数据。
我需要获取serverUrl和reportExt属性。
所以我像这样定义'this.reportUrl': this.reportUrl = this.model.get('reportUrl');
如果我这样做
console.log('this.reportUrl:', this.reportUrl);
但是我在尝试获取所需属性时失败了:
this.reportUrl.get('serverUrl') = undefined
this.reportUrl.serverUrl = undefined
this.model.attributes.reportUrl.get('serverUrl') = undefined
this.model.attributes.reportUrl.serverUrl = undefined
this.model.attributes.reportUrl.attributes.serverUrl = undfined
这是产生任何东西的唯一一条线:
当我拨打新的ReportUrl时, this.model.attributes.reportUrl.attributes = id: xxxxxx ^^ the test.id above
。
那么无论如何都要访问这些属性吗?
谢谢!
答案 0 :(得分:1)
您的主要问题是fetch()
是异步执行的。
您在控制台中看到的是请求完成后的数据,但您的代码之前执行,因此返回undefined
。
您的代码应为
var reportUrl = new ReportUrl({ id: test.id });
reportUrl.fetch({
success:function(model,response){
test.set({
reportUrl: model
});
var view = new reportUrlView({
model: test
});
}
});
或
var reportUrl = new ReportUrl({ id: test.id });
reportUrl.fetch().then(function(){
test.set({
reportUrl: reportUrl
});
var view = new reportUrlView({
model: test
});
});
不确定为什么要将模型设置为另一个模型 - 看起来您需要的只是执行test.fetch()
,并且您的后端shold会返回一个对象reportUrl
,其中包含所需的数据作为响应。那会更清洁。
无论如何,您可以访问this.model.get('reportUrl').get('serverUrl')
等属性,假设this
指向您的视图。
this.model.attributes.reportUrl.attributes.serverUrl
,this.model.get('reportUrl').attributes.serverUrl
,this.model.attributes.reportUrl.get('serverUrl')
等也应该有效,但这不是实现目标的主干方式。