Ember BelongsT断言失败

时间:2016-08-08 21:45:22

标签: ember.js belongs-to

考虑以下两种模式:汽车和车主

我和当前老板有一张车记录(bob jones) 我有一个所有者记录(鲍勃琼斯)详细信息...地址,电话等。

在我的车型(车型)中,我有这个:

export default Model.extend({
    "owner_id": DS.belongsTo('owner'),
    "year": attr(''),
    "model": attr(''),
    "make": attr('')
})

存储在DB端,ID为'12345',对应于Bob Jones所有者记录。

当我加载汽车记录(2015 Jaguar)时,它还将连接到Bob Jones记录,该记录告诉我他的电话,地址等。例如,如果我打印出来

{{owner_id.id}} - {{owner_id.name}}

我将展示:

12345 - Bob Jones

我的问题是,如果我改变汽车的所有者会发生什么。如果我选择下拉列表

{{my-select
    name="owner_id"
    content=ownerList
    selection=owner_id.id
    prompt="select an owner"
    required=true
}}

从这个组成部分:

import Ember from 'ember';

export default Ember.Component.extend({
  content: [],
  prompt: null,
  optionValuePath: 'value',
  optionLabelPath: 'label',

  init: function () {
    this._super(...arguments);
    if (!this.get('content')) {
      this.set('content', []);
    }
  },

  actions: {
    change: function () {
      let selectedIndex = this.$('select')[0].selectedIndex;
      let content = this.get('content');

      // decrement index by 1 if we have a prompt
      let hasPrompt = !!this.get('prompt');
      let contentIndex = hasPrompt ? selectedIndex - 1 : selectedIndex;
      let _selection = content[contentIndex];

      this.sendAction('willChangeAction', _selection);

      if (this.get('optionValuePath')) {
        this.set('selection', _selection[this.get('optionValuePath')]);
      } else {
        this.set('selection', _selection);
      }

      this.sendAction('didChangeAction', _selection);
    }
  }
});

并更改值...我收到此错误:

记录的ID在加载状态下无法更改

如何更新2015 Jaguar汽车记录以更改所有者,并加载新所有者的详细信息?

2 个答案:

答案 0 :(得分:1)

您收到错误是因为更改模型的相关模型需要将关系属性设置为不同的模型,而不是更改相关模型的ID。

xcskier56是对的,您应该将您的关系声明为:

"owner": DS.belongsTo('owner')

这更有意义,因为现在您拨打car.owner.idcar.owner.name而不是car.owner_id.idcar.owner_id.name

现在,如果您想更改汽车的所有者,则无法执行car.set('owner.id', newId);。您必须更改模型而不是ID,如下所示:car.set('owner', newOwner);

要使用select更改所有者,您可以使用支持对象/模型的选择插件作为选项(ember-power-select),或者使用类似于xcskier56的建议。

答案 1 :(得分:0)

您正在更改所有者的ID,而不是更改美洲虎上的owner_id道具。我将owner_id道具更改为owner,以帮助澄清belongsTo的内容。

我采取的一般策略是选择汽车的所有者,然后将其传回控制器以保存汽车。

模型/ car.js

export default Model.extend({
    "owner": DS.belongsTo('owner'),
    // ...
})

路由/汽车/ car.js

import Ember from 'ember';

export default Ember.Route.extend({
  model(params) {
    return Ember.RSVP.hash({
      car: this.store.find('car', params.id),
      ownerList: // however you get the owner list
    })
  }
})

控制器/汽车/ car.js

import Ember from 'ember';

export default Ember.Controller.extend({
  actions{
    ownerChanged(newOwner) {
      // If the select is setup properly, newOwner should be an instance of owner.
      const car = this.get('model.car');
      car.set('owner', newOwner);
      car.save
    }
  }
})

模板/汽车/ car.hbs。

{{my-select
    name="owner"
    content=model.ownerList
    selection=model.car.owner.id
    prompt="select an owner"
    required=true
    didChangeAction='ownerChanged'
}}

路由模型钩子中的代码主要是为了清晰起见,如果你采用不同的方法,相应地调整名称