【问题标题】:Ember.js dynamic model requestsEmber.js 动态模型请求
【发布时间】:2016-07-11 15:00:51
【问题描述】:

我正在尝试根据先前模型请求的结果从商店发出模型请求。请在下面找到代码:

路线:

model(params) {
  var id = params.framework_id;
  var main = this;
  return Ember.RSVP.hash({
    question: this.store.query('question', {orderBy: 'framework', equalTo: id}),
    framework: this.store.find('frameworks', id),
    frameworks: this.store.findAll('frameworks')
  })
}

然后在路由中有一个setupController:

setupController: function(controller, model) {
  this._super(controller, model);
  var main = this;
  ...
  controller.set("frameworkName", model.framework.get('name'));

  var includedFramework = model.framework.get('includedFramework');
  var includedFrameworkModel = this.store.find('frameworks', includedFramework);

  Ember.Logger.info(model.framework)
  Ember.Logger.info(includedFrameworkModel);

  if (model.framework.get('includedFramework') != undefined) {
    var linked = main.store.find("frameworks", model.framework.get('includedFramework'));
    controller.set("linkedFramework", {id: linked.get('id'), name: linked.get('name')});
  }
}

在控制器设置中,使用model.framework.get('name') 没有问题。 mode.framework.get('includedFramework') 工作正常并将 ID 返回到存储在框架模型中的另一个框架。然后我打算用另一个store.find 请求在商店中拉出“包含的框架”。不幸的是,第二个store.find 没有以与第一个相同的方式返回模型记录。这是每个请求返回的检查器视图:

model.framework -

包含框架模型 -

非常感谢任何帮助!

【问题讨论】:

    标签: javascript ember.js


    【解决方案1】:

    嗯,每次调用 ember-data 都会返回可能需要向服务器发出请求的内容,例如 find()findAll()query()save(),并且异步关系返回 PromiseObjectPromiseArray.

    它对对象和数组的工作方式相同,所以让我们描述一下数组是如何工作的。

    PromiseArray 既是 Promise 又是 ArrayProxy。 这非常有用,因为您可以根据自己的情况以两种方式使用它。

    由于对服务器的请求可能需要一些时间,因此生成的ArrayProxy 部分通常为空,稍后将填充数据。这非常有用,因为您的车把模板和计算属性将在 ArrayProxy 更改时更新。

    PromiseArray 的 Promise 部分将在从服务器接收到数据后立即解析,其中包含一个实际数组,稍后当您对数据进行进一步更改时,该数组也可能会更新。

    然而,ember 路由器将在加载路由之前等待 promise 被解析,这允许您指定 loading 基板。

    这就是model.frameworksetupController 不同的原因。这不是.find() 的结果,而是已解决的承诺的结果。这基本上就是Ember.RSVP.hash 为您所做的。


    一般来说我推荐你两件事。

    1. 不要在模型上存储模型 ID,而是使用关系。
    2. 请勿致电.setupController() 中的商店。在 .model() 钩子中执行所有请求并使用承诺链来执行此操作。

    也许以此为灵感:

    return Ember.RSVP.hash({
      question: this.store.query('question', {orderBy: 'framework', equalTo: id}),
      framework: this.store.find('frameworks', id),
      frameworks: this.store.findAll('frameworks')
    }).then(({question, framework, frameworks}) => {
      let includedFramework = framework.get('includedFramework');
      let includedFrameworkModel = this.store.find('frameworks', includedFramework);
      return {question, framework, frameworks, includedFrameworkModel};
    });
    

    【讨论】:

    • 感谢您的详尽解释。我按照建议更新了我的代码(我曾尝试过之前的一个版本),不幸的是没有任何变化。为了测试,我使用手动 ID 将includedFrameworkModel: this.store.find('frameworks', "-KLwTTCF8PFbBy7kNeys") 添加到我的模型中,一切正常。但是,当按照上述建议实施时,includedFrameworkModel 不会返回记录。您能否详细说明实现相同目标的关系?我试图实现关系,但对于这个应用程序没有成功。谢谢!
    • 只定义一个explicit inverse,可能设置为null。它也绝对有效,所以如果它不是你的问题是别的。你能提供一个不工作的ember-twiddle吗?
    【解决方案2】:
    var includedFrameworkModel = this.store.find('frameworks', includedFramework);
    

    store.find() 方法会返回promise,当你在日志中打印时对象没有被解析。

    把你的脚本改成这样。

    this.store.find('frameworks', includedFramework).then(function(includedFrameworkModel) {
        Ember.Logger.info(includedFrameworkModel);
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-09-15
      • 1970-01-01
      • 2014-11-02
      • 1970-01-01
      • 1970-01-01
      • 2018-11-24
      • 1970-01-01
      相关资源
      最近更新 更多