我有一个基本的主干模型,它的urlRoot
属性已设置,服务器端的相应目标返回正确的JSON输出(JSON字符串和application/json
标题)。
我叫这样的抓取:
var athlete = new Athlete({ id: 1 });
athlete.fetch();
此时如果我添加
console.log(athlete);
我可以看到模型,并在firebug中检查它我可以打开属性对象并查看从服务器返回的所有值。
但如果我这样做:
console.log(athlete.get('name'));
我得undefined
(名称出现在我上面提到的DOM检查中的属性下)
也做了:
console.log(athlete.attributes);
返回一个仅包含{id: 1}
的对象,这是我在创建模型时传递的参数。
如果我创建这样的模型:
var athlete = new Athlete(<JSON string copypasted from the server response>);
然后一切正常,.get()
方法返回我要求的任何内容,athlete.attributes
显示所有值。
我做错了什么?
答案 0 :(得分:18)
fetch
是异步的,这意味着如果您在获取后立即调用console.log(athlete.get('name'))
,则数据将无法使用。
在数据可用时使用事件通知,例如
var athlete = new Athlete({id: 1});
athlete.on("change", function (model) {
console.log(model.get('name'));
});
athlete.fetch();
或为您的提取添加回调
var athlete = new Athlete({ id: 1 });
athlete.fetch({
success: function (model) {
console.log(model.get('name'));
}
});
或利用fetch
返回的承诺:
athlete.fetch().then(function () {
console.log(athlete.get('name'));
});
答案 1 :(得分:1)
就像在这个例子中使用事件时的快速评论一样。在我的情况下,它不适用于change
,因为此事件会触发每次更改。所以sync
会这样做
诀窍。
var athlete = new Athlete({id: 1});
athlete.on("sync", function (model) {
console.log(model.get('name'));
});
athlete.fetch();