Ember:this.get返回一个getter(而不是我想要的对象)

时间:2014-06-22 21:11:20

标签: jquery object asynchronous ember.js getter

我有一个应该接受表单输入的操作,抓取当前登录的用户并将它们保存在一起。当我尝试通过以下方式登录用户时:

this.get('controllers.application.user')

我明白了:

Object { content: Getter, 3 more… }

而不是:

{first_name: 'Ashton', X more...}

奇怪的是,获取该对象的属性可以正常工作,例如:

this.get('controllers.application.user.first_name')

返回'Ashton'。以下是我的代码出现的背景,我很感激您提供的任何帮助。

App.IndexController = Ember.ArrayController.extend({
    needs: ['application'],
    actions: {
        createPost: function () {
            var writing = this.get('newContent');
            if (!writing.trim()) { return; }
            var post = this.store.createRecord('post', {
                writing: writing,
                author: this.get('controllers.application.user')
            });
            this.set('newContent', '');
            post.save();
        }
    }
});

2 个答案:

答案 0 :(得分:2)

你有什么理由把它放进Ember数据吗?它似乎只是额外的工作几乎没有收获(除非你计划进行大量的用户编辑等)。

从我看到的情况来看,您希望用户随处可访问。我建议使用容器在所有控制器/路由上注册用户。

App.initializer({
  name: "appUser",
  after:['ember-data'],

    initialize: function (container, application) {
      // if you want to use the store
      var store = container.lookup('store:main'),
          user = App.CoolUser.create();

      Ember.$.getJSON('api/users/me', function(data) {
        for(var key in data.user){
          user.set(key, data.user[key]);
        }
      });
      application.register("my:user", user, {instantiate:false});
      application.inject("controller", "user", "my:user");
      application.inject("route", "user", "my:user");
    }
});

然后从任何控制器/路线,您可以使用以下方式直接访问您的用户:

this.user....

http://emberjs.jsbin.com/OxIDiVU/711/edit

如果在发生任何事情之前提取用户很重要,那么一旦发生回调,您将需要deferReadinessadvanceReadiness。如果你走这条路线,你也会想要为失败的回调做准备,以免你的应用程序处于停滞状态。 http://emberjs.com/api/classes/Ember.Application.html#toc_routing

App = Ember.Application.create();
App.deferReadiness();

...

  Ember.$.getJSON('api/users/me', function(data) {
    for(var key in data.user){
      user.set(key, data.user[key]);
    }
    application.advanceReadiness();
  });

http://emberjs.jsbin.com/OxIDiVU/712/edit

答案 1 :(得分:2)

您需要指定您想要的内容。试试这个:

this.get('controllers.application.user.content')

执行this.get('controllers.application.user.first_name')时,Ember知道查看first_name属性的内容,从而获得返回的属性值。