如何将currentUser注入所有其他用户模型

时间:2014-01-06 14:37:12

标签: ember.js ember-data

在我的应用程序中,我有几个可以成为朋友的用户。现在我正在尝试构建一个从当前登录用户到另一个用户获取“friendShipStatus”的函数。 这是以下问题的后续问题:Intersection of promises and dependent computed properties

 /**
 *  Gives the relation between two User
 *  4: has requested your friendship
 *  3: Yourself
 *  2: Friends
 *  1: FriendShip Request
 */
friendShipStatus: function() {
        return this.container.lookup('user:current').then(function(user){
            if(this.get('friends').contains(user)){
                return 2;
            } else if(this.get('friendsWithMe').contains(user)){
                return 4;
            } else if(this.get('myFriends').contains(user)){
                return 1;
            } else if (this.get('id') === user.get('id')){
                return 3;
            } else {
                return 0;
            }
        });

}.property('friends.@each')

Promise的东西已经是尝试,但不起作用。我宁愿让currentUser注入并观察属性,只要当前用户被解析,属性就会改变。我的尝试因此:

Ember.Application.initializer({
  name: "currentUser",

  initialize: function(container, application) {
    var store = container.lookup('store:main');
    container.register('user:current', store.find('user', 1), { instantiate: false, singleton: true });
  }
});

Ember.Application.initializer({
  name: "injectCurrentUser",
  after: 'currentUser',

  initialize: function(container) {
    // container.injection('controller:application', 'currentUser', 'user:current');
    container.typeInjection('route', 'currentUser', 'user:current');
    container.typeInjection('controller', 'currentUser', 'user:current');
    container.typeInjection('model', 'currentUser', 'user:current');
    container.injection('user:model', 'currentUser', 'user:current');
  }
});

我已经尝试了注射类型和常规注射。但是在我的usermodel中,我的currentUser属性总是未定义的。

如何将当前用户注入我的用户模型?

3 个答案:

答案 0 :(得分:3)

在注册之前,您并没有等待用户从ember数据返回。你可能希望推迟准备就绪,直到它回来为止。尝试这样的事情:

Ember.Application.initializer({
  name: "currentUser",

  initialize: function(container, application) {
    application.deferReadiness();
    container.lookup('store:main').find('user', 1).then(function(user) {
      application.register('user:current', user, { instantiate: false, singleton: true });
      application.inject('route', 'currentUser', 'user:current');
      application.inject('controller', 'currentUser', 'user:current');
      application.advanceReadiness();
    }, function() {
      application.advanceReadiness();
    });
  }
});

我不确定你为什么要注入你的模型,路由/控制器就足够了。另请注意,这是一个初始化程序而不是两个。

答案 1 :(得分:3)

刚刚找到了使用ember-cli服务的另一种解决方案。首先生成服务ember g service user。然后将store注入服务,以便您可以执行find()。接下来,将您的服务从标准Object更改为ObjectProxy。最后在init()上执行查找并将结果设置为content。以下是我最终的内容:

// app/initializers/user-service.js
export function initialize(container, application) {
    application.inject('route', 'user', 'service:user');
    application.inject('controller', 'user', 'service:user');
    application.inject('service:user', 'store', 'store:main');
}

export default {
    name: 'user-service',
    initialize: initialize
};

// app/services/user.js
import Ember from 'ember';

export default Ember.ObjectProxy.extend({
    init: function(){
        this.set('content', this.store.find('user', 1));
    }
});

答案 2 :(得分:1)

关于模型注入,实际上是可行的,请参阅此处的答案

Injecting dependencies into an Ember model