Backbone.js 属性/获取似乎很有趣

Backbone.js attribute / fetching seems to work funny

所以,我有以下访问我休息的代码api:

Employees.Employee = Backbone.Model.extend({
    urlRoot: 'api/employee'
})
var daryl = new Employees.Employee({id:17})

daryl.fetch()
console.log(daryl.attributes)

现在,当我console.log属性时,daryl对象大致是这样设置的:

daryl = {
  attributes: 
    [0]: {
    id: 17,
    first: 'Daryl',
    last: 'xxxx',
    email: 'xxx'
    },
    id: 17,
    watchers...
    protos...
 }

所以尝试 daryl.get('first') 结果未定义。其他所有内容都存储在数组中索引 0 处的对象中。这是为什么?我是这里的新手,但这绝对不是大多数教程显示 backbone 工作原理的方式。

所以如果我这样做 daryl.get('first'),我会得到未定义的。 daryl.get('id') 按预期工作。 daryl.get('0') 实际上 returns 实际模型的一个普通旧 javascript 对象,即我可能期望我的 backbone 模型实际上是什么。这是为什么?

不确定这是否是问题所在(但在调用 fetch 之后执行 console.log 是有问题的),但重要的是要记住 daryl.fetch() 是异步发生的。

也就是说,你应该试试:

daryl.fetch().done(function(){
  console.log(daryl.attributes);
  model.get("first");
});

daryl.fetch({success : function(model){
  console.log(model);
  model.get("first");
}});

这确保 AJAX 请求在尝试对模型采取行动之前完成,这很好地解释了为什么 get returns undefined.

您的服务器似乎在其响应中 returning 一个数组,因此为什么调用 model.get('0') 是 returning 您真正想要的属性。您需要将服务器的响应修改为仅 return 对象(而不是数组中的对象),或者您需要将 parse 方法添加到模型到 return 第一项在响应数组中。