2016-08-08 11 views
0

を失敗しました以下の2機種考えてみましょう:私は現在の所有者と車の記録(ボブ・ジョーンズ) を持っていると私は詳細を所有者レコード(ボブ・ジョーンズ)を持っている車の所有者エンバーbelongsToのアサーションは

を...アドレス、私の車のフォーム(車種)に電話など

、私はこの持っている:DB側に保存されている

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

を、ボブ・ジョーンズの所有者のレコードに対応する、ID「12345」です。

私は車の記録(2015年ジャガー)をアップロードすると、私は

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

をプリントアウトした場合、それはまた、例えば彼の電話、住所などを私に語ったボブ・ジョーンズレコードに接続しますが、私はしますショー:

12345 - ボブ・ジョーンズ

私の質問は、私は車の所有者を変更した場合に何が起こるか、です。私はこのコンポーネントからドロップダウンリスト

{{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カーレコーダーの更新方法新しい所有者の詳細を読み込んで所有者を変更するか?

+0

どのような選択コンポーネントを使用していますか?私は、私の答えでコンポーネントを正しくセットアップする方法を変更するので、興味があります。 – xcskier56

+0

は、コンポーネントコードを反映するように更新された質問です。 – Matt

答えて

0

ジャガーのowner_id小物を変更するのではなく、所有者の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 
    } 
    } 
}) 

テンプレート/車/カー。 hbs。

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

ルートのモデルフックのコードはわかりやすくするために大部分がありますが、異なるアプローチを取っている場合は、それに応じて名前

+0

理論的には意味がありますが、selection = model.car.owner.idはオーナーのdocに属しているcar docに関連しています...そしてオーナーのdocの中にはid '12345' selection = '12345'正しいオーナーを返します。 (車のドキュメントでは、所有者はすでに格納されているIDとして '12345'と同じであることを覚えておいてください。選択を変更した瞬間にエラーが発生する場所です。新しいIDをcar docに保存してください。私にはowner(car doc)idを変更すると、新しいIDのオーナー文書が見つかるはずです。 – Matt

1

モデルの関連モデルを変更すると、設定を伴うので、あなたがエラーを取得している調整をありますその関係属性を別のモデルに変更し、関連するモデルのidを変更しない。今、あなたはむしろcar.owner_id.idまたはcar.owner_id.nameよりcar.owner.idまたはcar.owner.nameを呼び出すので、それはより理にかなって

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

xcskier56はあなたとあなたの関係を宣言する必要があることを右です。

車の所有者を変更する場合は、car.set('owner.id', newId);を実行することはできません。 car.set('owner', newOwner);

また、selectを使用して所有者を変更する場合は、オブジェクト/モデルをサポートするselect addonsをオプション(ember-power-select)で使用するか、または次のようにidを変更する必要があります。 xcskier56の提案に似た独自のものを作ってください。

+0

Ahhh ok。混乱を許してくれてありがとうございます。 – Matt

関連する問題