ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

javascript – backbone.js Model.get()使用coffeescript咖啡烤面包机返回undefined,scope?

2019-06-30 05:24:29  阅读:307  来源: 互联网

标签:javascript coffeescript backbone-js scoping


我正在使用coffeescript编写一个应用程序,用咖啡烤面包机(一个非常棒的NPM模块进行拼接)来构建我的app.js文件.

我的许多应用程序类和模板需要有关当前用户的信息,所以我有一个类User(扩展Backbone.Model)的实例存储为我的主Application类的属性(扩展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

但是,尽管在记录时控制台中存在模型属性,但第二个返回undefined仍未定义.

只是为了让事情变得更有趣,在控制台中输入“window.app.user.get(’email’)”会手动返回“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中初始化Application控制器,如下所示:

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

建议请谢谢!

解决方法:

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

> fetch是异步的.
>某些console.log是异步的.

所以这就是发生的事情:

>您调用@ user.fetch()并启动AJAX调用.
>您调用console.log(@user)并执行另一项异步工作但是(这是一个很大的但是!),它会引用@user及其引用,当console.log时引用将被取消引用呼叫进行记录.
>你调用console.log(@ user.get(’email’)),这会带来@ user.get(’email’)返回的内容,get调用将立即执行.
>来自(1)的AJAX调用返回@user的一些内容.
> console.log调用可以在控制台中记录事物.

来自(2)的console.log带有对fetch填充的@user的引用(4);在执行时间(4)时,已填充@user,因此您在控制台中看到一个完整的用户.当你在(3)中调用@ user.get(’email’)时,fetch还没有填充@user,所以@ user.get(’email’)是未定义的,你实际上在说

console.log(undefined)

当您调用函数而不是完成执行并将事物放入控制台时,将评估console.log调用的参数(但传递给console.log的最终结果不会被取消引用!).

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

如果您将代码更改为:

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

你会得到你期望的结果.

标签:javascript,coffeescript,backbone-js,scoping
来源: https://codeday.me/bug/20190630/1333280.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有