0

我在 peepcode.com 上购买了 Ember.js 的 play by play 并按照提供的视频进行跟踪。

所以,我在 Rails 中设置了模型、序列化器和控制器。

当我这样输入 URL 时。

http://localhost:3000/actors/wycats

JSON 响应按我的预期呈现。(这可能是 Ember-data 期望的 JSON 形式……对吧?)

 {
   "actor": {
     "id": 1,
     "blog": "http://www.yehudakatz.com",
     "company": "Tilde, Inc.",
     "email": "wycats@gmail.com",
     "gravatar_id": "428167a3ec72235ba971162924492609",
     "location": "San Francisco",
     "login": "wycats",
     "name": "Yehuda Katz",
     "actor_type": "User"
   }
 }

所以我在 ember.js 中设置了 Store 和 Actor Model

 GithubScore.Store = DS.Store.extend({
   revision: 11,
   adapter: "DS.RESTAdapter"
 });


 GithubScore.Actor = DS.Model.extend({
   login: DS.attr('string'),
   name: DS.attr('string'),
   gravatarId: DS.attr('string'),
   location: DS.attr('string'),
   blog: DS.attr('string')
 });

我启动了我的 Ember 应用程序,没有发生错误。

但是当我尝试使用控制台获取模型时(我已经在 Rails DB 中保存了一个 ID 为 1 的模型)

 GithubScore.Actor.find(1)

它返回一个类,没有发生错误,但是当我尝试获取它的属性时。它只返回 null,尽管模型的状态为“isLoaded”

 GithubScore.Actor.find(1).get('isLoaded')
 => true

 GithubScore.Actor.find(1).get('blog')
 => null

我发现当我第一次重复调用 GithubScore.Actor.find(1).get('isLoaded') 时,它只返回 false,但是当我尝试获取属性时,'isLoaded' 立即更改为 true。

 GithubScore.Actor.find(1).get('isLoaded')
 => false (for many times)

 GithubScore.Actor.find(1).get('blog')
 => null

 GithubScore.Actor.find(1).get('isLoaded')
 => true (immediately changed)

当我尝试 .toJSON() 方法像视频一样建模时。它抛出一个错误。

 GithubScore.Actor.find(1).toJSON()
 => TypeError: Object <GithubScore.Actor:ember272:1> has no method 'toJSON' 

我好奇的一件事是,尽管 GithubScore.Store 对象是从 DS.Store 扩展而来的。

它没有 DS.store 已有的 find(type, id) 方法。

我找不到问题所在。你能给我一些帮助吗?

感谢您的阅读!

4

1 回答 1

3

尝试在模板中显示博客值并通过浏览器访问它。当您执行GithubScore.Actor.find(1).get('blog')它时,它会返回 null,因为 Ember 只是将一个对象作为 Promise 重新调整,同时仍在获取它的过程中。当您尝试在模板中显示值时,模板将绑定到该值,并在检索到该值后进行更新。

至于,显然这是一个错误,我在 RecordArray 上遇到了同样的问题,并且在上一个关于 stackoverflow 的问题以及其他人isLoaded = true的问题中也有报道。

于 2013-01-24T20:50:27.233 回答