Ember.js动态模型请求

时间:2016-07-11 04:02:30

标签: javascript ember.js

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

路线:

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 -

model.framework

includedFrameworkModel -

includedFrameworkModel

非常感谢任何帮助!

2 个答案:

答案 0 :(得分:0)

好吧,每次调用ember-data都会返回可能需要向服务器发送请求的内容,例如find()findAll()query()save()和async关系返回PromiseObjectPromiseArray

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

PromiseArrayPromiseArrayProxy。 这非常有用,因为您可以根据自己的情况以两种方式使用它。

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

PromiseArray的Promise部分将在服务器收到数据后立即解析,并带有实际数组,以后在您对数据进行进一步更改时也可能会更新。

然而,在加载路由之前,ember路由器将等待承诺得到解决,这允许您指定loading基板。

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

一般来说,我建议你做两件事。

  1. 不要在模型上存储模型ID,而是使用关系。
  2. 请勿在{{1​​}}中致电商店。在.setupController()挂钩中完成所有请求,并使用promise链理。
  3. 也许以此为灵感:

    .model()

答案 1 :(得分:0)

$("#emlpyeetd").after('<s:textfield id="employeeVal" name="employeeView.policyOrQuoteNumber" maxlength="15" style="width: 200px;" class="hideForAnotherField" theme="simple"></s:textfield>');


<td width="25%">
  employee
</td>
<td id="policytd" class= "anotherfield" width="25%"></td>

store.find()方法将返回promise,在日志中打印时对象未解析。

将您的脚本更改为此类内容。

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