2017-06-15 13 views
1

を保存するとき、私はモデルhasDirtyAttributesember.jsは手動

がhasDirtyAttributesフラグがするとき、関連モデルへの参照を設定していないように見えるときアクティブに私のテンプレートで保存ボタンがクリアされていないhasDirtyAttributesを設定します変更。


私は、関連するモデルで選ぶことができますドロップダウンは、私が直接の属性(例えば、名前)を変更した場合、すべてが期待どおりに動作し、保存ボタン接触
と呼ばれています活性化する。
私は連絡先を変更しても、これは意図していないと思いますので、私は変更アクションが発生したときにフラグを設定します。

私はそうのような私のルートアクションでこれを設定しています:今、それが再び動作する

actions:{ 

    updateProductionContact: function(contact){ 
     this.set('currentModel.customer.hasDirtyAttributes',true);    
     this.set('currentModel.customer.production_contact',contact); 
    }, 
} 

。連絡先を変更すると、保存ボタンが点灯します。
しかし、今度はsaveをクリックすると、hasDirtyAttributesフラグはtrueのままです(ボタンはアクティブのままです)。以前は別の変更が行われるまでクリアされていました。

私は以前のように、保存に成功した後、自動的にフレームワークを再設定するためのフラグを期待します。私はもちろん、ボタンの保存アクションにフラグを再設定することができます。

私は問題の周りに自分の道をハッキング、そしておそらくhasDirtyAttributesを手動で設定すべきではないか、私は汚れの異なる指標を使用する必要があることをことをしていますようにそれは感じています。

質問:正しく処理するにはどうすればよいですか?

+0

はい、永続的なレコードガイド(https://guides.emberjs.com/v2.13.0/models/creating-updating-anddeleting-records)に従って値が汚れていないかどうかを確認するには、 'hasDirtyAttributes'を使用してください/#toc_persisting-records)。しかし、私は保存後になぜ汚れが本当に残っているのか分かりません。あなたは、エバースラック 一般的なチャンネルで多くの助けを求めることができます。 – AlexMA

答えて

1

hasDirtyAttributesは、計算されたプロパティーがDS.Modelなので、設定した場合は手動で設定しないで、次回は再計算しないでください。属性の変更があれば更新されます。

Alexmaコメントで提案されているように、あなたはdirtyAttributesを使用することができます。 https://guides.emberjs.com/v2.13.0/models/creating-updating-and-deleting-records/#toc_persisting-records 自分で設定しないでください。

は参照してください:それはhasDirtyAttributesが判明 https://github.com/emberjs/data/blob/v2.13.0/addon/-private/system/model/model.js#L162

+0

すでにそのページを読みました。ソースコードへのあなたのリンクは、hasDirtyAttributesが確かに計算されたプロパティであることを明確にしています。 emberのインスペクタでは、フラグとして表示されるので、私はそれを設定できると決めました。 – Loopo

0

が関数/計算プロパティです。だからset(...、true)を使うと、関数をブール値で上書きします。これは私たちが望むものではありません。

emberの計算されたプロパティにsetterとgetterがある方法がありますが、ここでは実装されていないようです。

私は以下の解決策を考え出しました。

基本的にこれは、関連するモデルのための独立したカスタムフラグを実装しています。その後

model: function(params) { 
    return Ember.RSVP.hash({ 
     customer: this.store.findRecord('customer',params.id), 
     .... 
     dirtyRelations: false 
    }); 
}, ... 

関連モデルは

updateProductionContact: function(contact){ 
    this.set('currentModel.dirtyRelations',true);    
    ... 
}, ... 

を変更され、私のセーブ機能がfalseに戻ってそれを設定したときに、私はこれを手動で設定:ルートのモデルプロパティに

私は、追加のプロパティを定義しています。 hasDirtyAttributes OR dirtyRelationsのいずれかのために

updateCustomer: function(){ 
    this.get('currentModel.customer').save(); 
    this.set('currentModel.dirtyRelations',false); 
} 

マイtemplate.hbsチェック

{{#if (or model.customer.hasDirtyAttributes model.dirtyRelations)}} 
    highlighted save 
{{else}} 
    plain save 
{{/if}} 

は、これまでのところ、これはうまく動作しているようです。通常のプロパティの自動ダーティトラッキングを利用できます。