2011-12-19 7 views
1

現在選択されているアイテムの編集に使用するアイテムとフォームのリストがあります。アイテムをクリックすると、コレクションコントローラーの「現在の」プロパティーとして設定され、編集用に選択されます。 Hereはjsfiddleの簡略化された例です。キーアップ時にTextFieldのバウンド値を同期しません(アイテムが保存されるまで待つ)

私の問題は、現在のアイテムを編集するときに、各キーアップ後に変更がアイテムに反映されることです。私は本当に "保存"が押されるまで、アイテムに変更を反映させたくありません。バインドされたプロパティを明示的に通知するまで同期化を抑止する方法はありますか?

答えて

3

jsfiddleを追加しました。コピーを作成して元のオブジェクトに戻す方法をデモストします。

コードも次のとおりです。私はコピー可能なミックスインを使ってコピー機能を追加しました。オブジェクトのインスタンスを保持しながら、オブジェクトの全体を置き換えるだけで、Projectの別のインスタンスから値をコピーする新しい "マージ"機能を追加しました。

は、私が「return App.Project.create(this)」コピー機能であなたができることの通知を行なったし、実験的に同様に動作するように見えたが、私は明快さ(と確実性を)言って、具体的な特性をコピーします。

// By adding Copyable, you're adding the 'copy' mixin 
App.Project = Ember.Object.extend(Ember.Copyable, { 
    save: function() { 
     console.log('saving') 
    }, 
    copy: function(deep) { 
     return App.Project.create({ 
      name: this.get('name'), 
      source: this.get('source') 
     }); 
    }, 
    // grab new values and directly insert them 
    // this way, it preserves object identity 
    merge: function(source) { 
     this.set('name', source.get('name')); 
     this.set('source', source.get('source')); 
    } 
}); 

はここで、私は現在の場所にProjectFormで使用される新しいプロパティ(editCopy)を追加しました。編集が完了して保存がクリックされると、データはオリジナルにマージされます。

App.projectController = Ember.ArrayController.create({ 
    content: [], 
    current: null, 
    editCopy: null, 
    saveCurrent: function() { 
     var toSave = this.get('current'); 
     toSave.merge(this.get('editCopy')); 
     toSave.save(); 
    } 
}); 

App.ProjectEditLink = Ember.View.extend({ 
    click: function() { 
     App.projectController.set('current', this.get('project')); 
     App.projectController.set('editCopy', this.get('project').copy()); 
    } 
}); 

App.ProjectForm = Ember.View.extend({ 
    templateName: 'project_form_template' 
}); 



App.projectController.pushObject(App.Project.create({ 
    name: "jQuery", 
    source: "jquery.js" 
})); 
App.projectController.pushObject(App.Project.create({ 
    name: "Ember", 
    source: "ember.js" 
})); 
App.projectController.pushObject(App.Project.create({ 
    name: "Backbone", 
    source: "backbone.js" 
})); 
+0

非常に良い。これはまさに私が探しているものです。ありがとう! – adamlogic

1

フィールド値を編集中のレコードのコピーにバインドすることをお勧めします。次に、ユーザーが保存ボタンをクリックすると、それらの値を取得して元のレコードに戻します。

+0

私はこれが私が必要とする方向だと思っていますが、私はそれを働かせることができませんでした。それについてどうやって行きますか? – adamlogic

+0

http://contacts.strobeapp.com/で働いていた連絡先サンプルアプリをチェックアウトすることができます。これはemberjsへのアップデートの前でしたが、原則は似ているはずです。基本的には、ユーザーが選択したオブジェクトのコピーを作成し、ビューにコピーのデータを設定します。まだいくつかのバグがありますが、うまくいけば、正しい方向に向けるのに役立ちます。 [編集] WPCoderはすでにあなたに例を与えたようです。 – Blacktiger

関連する問題