backbone.js Model.get() 返回未定义,范围使用咖啡脚本+咖啡烤面包机?

2024-03-03

我正在使用 Coffeescript 和咖啡烤面包机(一个很棒的用于拼接的 NPM 模块)编写一个应用程序,该应用程序构建了我的 app.js 文件。

我的许多应用程序类和模板都需要有关当前用户的信息,因此我有一个 User 类(扩展 Backbone.Model)的实例存储为我的主应用程序类(扩展 Backbone.Router)的属性。

作为初始化例程的一部分,我从服务器获取用户(负责身份验证、角色、帐户切换等)。这是咖啡脚本:

@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: "[email protected] /cdn-cgi/l/email-protection"
  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('email')”会返回“的预期值”[电子邮件受保护] /cdn-cgi/l/email-protection"... ?

仅供参考,以下是初始化方法如何编译到我的 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();
});

请提出建议并谢谢!


这里有两件事你需要理解:

  1. fetch是异步的。
  2. Some console.log是异步的。

所以这就是发生的事情:

  1. 你打电话@user.fetch()然后它启动 AJAX 调用。
  2. 你打电话console.log(@user)这又做了一些异步工作,但是(这是一个很大的但是!),它需要引用@user与此同时,当console.log调用进行记录。
  3. 你打电话console.log(@user.get('email')),这需要什么@user.get('email') returns, the get调用将立即执行。
  4. AJAX 调用来自(1)返回一些东西@user.
  5. The console.log调用会在控制台中记录内容。

The console.log from (2)带有对@user that fetch居住在(4);到......的时候(4)执行,@user已填充,因此您可以在控制台中看到完整的用户。你打电话时@user.get('email') in (3), the fetch尚未填充@user yet so @user.get('email') is undefined你实际上是在说

console.log(undefined)

的论据console.log将评估调用(但传递给的最终结果console.log不会取消引用!)当您调用该函数时,而不是当它完成执行并将内容放入控制台时。

因此,各种异步事物混合在一起,这就是混乱。

如果您将代码更改为:

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

你会得到你期望的结果。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

backbone.js Model.get() 返回未定义,范围使用咖啡脚本+咖啡烤面包机? 的相关文章

随机推荐