2016-07-19 5 views
-1

Emberストアのレコードを更新しようとしています。私はこれをしようとすると、それは次のエラーが返されます。コントローラは、このようになりますEmberでレコードを操作しようとするとコンテンツが未定義です。

Uncaught Error: Assertion Failed: Cannot delegate set('name', test) to the 'content' property of object proxy : its 'content' is undefined.

import Ember from 'ember'; 

export default Ember.Controller.extend({ 
    model: null, 
    event: { 
    name: "test", 
    id: "adfg8943224xcvsdf" 
    }, 
    actions: { 
    editEvent (event) { 
     var Event = this.store.find('event', event.id); 

     Event.set('name', event.name); 
     Event.save() 
    } 
    } 
}); 

ルートは次のようになります。

import Ember from 'ember'; 

export default Ember.Route.extend(AuthenticatedRouteMixin, { 
    model() { 
    return { 
     event: this.store.find('event') 
    } 
    }, 
    setupController (controller, model) { 
    controller.set('model', model); 
    } 
}); 

テンプレートは、トリガーイベントと呼ばれるオブジェクトを送信します。このオブジェクトには、nameやidなどのプロパティがあります。イベントオブジェクトの値はコントローラから来て、editEventアクションをトリガーする前に設定されています:

<form {{action 'editEvent' event on="submit"}}> 
+1

は '約束を返しfind'ませんか?また、テンプレートコード、特に 'editEvent'アクションを呼び出す部分、つまり' event'は何ですか? –

+0

Findは、コンテンツクラスを内部に持つクラスを返します。イベントは、nameやidのようなプロパティを持つオブジェクトです。 –

+0

モデルフックからPOJOを返すのですか?通常、あなたは約束を返すでしょう。なぜあなたは 'store.find'をそのようなオブジェクトにラップしていますか?複数のモデルを読み込もうとしていますか? – Sarus

答えて

0

は私が何が起こっているのかと考えているあなたのmodelフックが解決される約束が含まれているPOJOを返しているということです。あなたの行動にそれを渡したいなら、あなたはエンバーは、テンプレートをレンダリングする前にロードするためにあなたのデータを待機するように、あなたが本当に自分のmodelフックからの約束を返す必要があります言われていること

<form {{action 'editEvent' model.event on="submit"}}> 

を行う必要があります。データのロードに時間がかかる場合は、モデルをロードする前に誰かがフォームを送信してエラーが発生する可能性があります。

私はあなたのルートは、この(setupControllerを上書きする必要はありません)のように見えるようにしたいと思う:あなたのテンプレートに続いて

import Ember from 'ember'; 

export default Ember.Route.extend(AuthenticatedRouteMixin, { 
    model() { 
    return this.store.find('event');   
    } 
}); 

<form {{action 'editEvent' model on="submit"}}> 

あなたは複数のモデルをロードする必要がある場合、あなたはEmber.RSVP.hashを使用してください。

この回答を参照してください:EmberJS: How to load multiple models on the same route?

はまた、私はあなたの行動がやろうとしているものはかなりよく分からないが、あなたは再びレコードを検索する必要はありません。アクションのために投稿したコードは実際には何もしません。イベントを取得し、イベントの名前を独自の名前に設定します。

actions: { 
    editEvent (event) { 
     // you already have the event, you passed it in as a parameter 
     // you don't need to query the store again for it. 
     var Event = this.store.find('event', event.id); 

     // This doesn't do anything as it just sets the event.name to itself 
     Event.set('name', event.name); 
     Event.save() 
    } 
    } 

私はあなたがこれを行うには意味を考える:

actions: { 
    editEvent (event) { 
     event.set('name', 'updated name'); 
     event.save(); 
    } 
    } 
関連する問題