Backbone.js的Model.get()返回undefined,使用范围的CoffeeScri

2019-09-17 22:07发布

我正在写使用咖啡烤面包机(一个真棒NPM模块拼接)的CoffeeScript是构建我的app.js文件的应用程序。

我的应用程序类和模板的很多要求有关当前用户的信息,所以我有类用户(延伸Backbone.Model)存储作为我的主要应用程序类的属性(扩展Backbone.Router)的一个实例。

作为初始化程序的一部分,我抓住从服务器的用户(这需要身份验证,角色,帐户交换等服务)。 下面是CoffeeScript的:

@user = new models.User
@user.fetch()
console.log(@user) 
console.log(@user.get('email'))   

第一个日志记录语句输出正确的Backbone.Model在控制台属性对象,只是因为它应该:

User
_changing: false
_escapedAttributes: Object
_pending: Object
_previousAttributes: Object
_silent: Object
attributes: Object
  account: Object 
  created_on: "1983-12-13 00:00:00"
  email: "ben@accomplicecreative.com"
  icon: "0"
  id: "1"
  last_login: "2012-06-07 02:31:38"
  name: "Ben Ipsen"
  roles: Object
__proto__: Object
changed: Object
cid: "c0"
id: "1"
__proto__: ctor
app.js:228

然而,尽管该模型未定义第二个返回属性明确时登录控制台在那里。

而只是为了让事情更有趣,键入“window.app.user.get(‘电子邮件’)”进入控制台手动返回“ben@accomplicecreative.com”的预期值...?

仅供参考,这里的initialize方法如何编译成我的app.js文件:

Application.prototype.initialize = function() {
  var isMobile;
  isMobile = navigator.userAgent.match(/(iPhone|iPod|iPad|Android|BlackBerry)/);
  this.helpers = new views.DOMHelpers().initialize().setup_viewport(isMobile);
  this.user = new models.User();
  this.user.fetch();
  console.log(this.user);
  console.log(this.user.get('email'));
  return this;
};

我初始化应用程序控制器在我的静态HTML像这样:

jQuery(document).ready(function(){
   window.app = new controllers.Application();
});

建议请和谢谢!

Answer 1:

有迹象表明,你需要了解这里的两件事情:

  1. fetch是异步的。
  2. 有些console.log s为异步的。

因此,这是发生了什么:

  1. 你叫@user.fetch()并启动一个AJAX调用。
  2. 你叫console.log(@user)和做的异步工作,但另一位(这是一个很大的,但是!),它需要一个参考@user与它一起,参考将被取消引用的时候console.log调用做它的日志记录。
  3. 你叫console.log(@user.get('email'))这所沿的需要@user.get('email') 返回时, get的通话将被立即执行。
  4. 由式(1)的AJAX调用返回一些东西了@user
  5. console.log调用避开在控制台登录的事情。

所述console.log由式(2)承载的一个参考@userfetch(4)填充; 由(4)执行时, @user已被填充,所以你在控制台中看到完整的用户。 当你调用@user.get('email') (3)中, fetch还没有填充@user却又如此@user.get('email')undefined ,你实际上是在说

console.log(undefined)

对于这些参数console.log通话将被评估(但传递给最终的结果console.log不会提领!)当你调用函数,而不是当它完成执行,并把事情在控制台中。

所以,你有各种异步的东西混合在一起,这其中就有混乱。

如果你改变你的代码如下:

@user = new models.User
@user.fetch(success: =>
    console.log(@user) 
    console.log(@user.get('email'))   
)

你会得到你期待的结果。



文章来源: backbone.js Model.get() returns undefined, scope using coffeescript + coffee toaster?