从组件中查找商店

时间:2015-11-21 00:29:15

标签: javascript ember.js ember-data

我有一个包含组件的模板。

// pods/workgroup/template.hbs
...
{{workgroup/member-add
    wgId=model.id
    store=store
    peekUser2Workgroup=peekUser2Workgroup
}}
...

在该组件中,我需要查找商店中是否已存在某些内容。

//somewhere in components/workgroup/member-add/componsent.js
let alreadyInStore = this.store.peekRecord('user2workgroup',u2wId);

我通过将商店注入组件(如上所述)使其成功,这当然是不好的做法 所以我尝试在我的父控制器中创建一个执行商店查找的属性:

//in components/workgroup/member-add/componsent.js
let alreadyInStore = this.get('controller').peekUser2Workgroup(u2wId);


//in pods/workgroup/controller.js
peekUser2Workgroup: function(u2wId) {
    console.log(this);
    console.log(this.store);
    return this.store.peekRecord('user2workgroup',u2wId);
}

只要我将整个商店传递到上面的补偿中,这个工作正常 但是,如果我没有将商店传递给组件,它将被定义为未定义,但从不直接从组件访问(商店仅存在于控制器中)。

登录this的控制台令我惊讶的是,组件而非控制器this.store未定义。
所以我已经了解到,使用this时,当从外部/组件调用函数/参数时,我无法访问控制器本身。

问题是,如何让控制器通过this引用自身?

或者如何从外部调用参数时访问商店?
我真的需要将控制器本身传递给自己吗? 像这样:

// in component
let alreadyInStore = this.get('controller').peekUser2Workgroup(this.get('controller'), u2wgId);

//in controller
peekUser2Workgroup: function(myself, u2wId) {
    console.log(this);
    console.log(this.store);
    return myself.store.peekRecord('user2workgroup',u2wId);
}

这对我来说似乎很奇怪,而且看起来我只是在转移到控制器的时候,比我最初的转移更多...

Ember:2.0.1 Ember-Data:2.0.0

1 个答案:

答案 0 :(得分:3)

不是将商店作为属性传递给组件,而是使用Ember.service注入它,如下所示:

store: Ember.service.inject()

然后,不要传入函数,只需传入你正在查找的id vale:

{{workgroup/member-add
    wgId=model.id
}}

现在,您可以在组件中获取记录:

workgroup: function(){
  return this.get('store').peekRecord('user2workgroup', this.get('wgId'));
}.property()