2

ClientsController を介して表示されるクライアントのリストがあり、その内容は Client.find() 、つまり RecordArray に設定されています。ユーザーは、ルート ハンドラーでコンテンツが Client.createRecord() に設定されている ClientController を介して新しいクライアントを作成します。

すべて正常に動作しますが、ユーザーがクライアントの作成フォームに入力している間、クライアント リストはルート ハンドラで作成された新しいクライアント レコードで更新されます。

レコードが保存されるまで、RecordArray/Store に新しいレコードのみを認識させる最良の方法は何ですか?

更新:オブジェクトのステータスに基づいてリストをフィルタリングすることになりました

{{#unless item.isNew}} Display the list {{/unless}}

更新 - 2 これはフィルターを使用する別の方法ですが、最初に find メソッドを介してストアをロードする必要があります。

// Load the store first     
App.Client.find();
    var clients = App.Client.filter(function(client){            
        console.info(client.get('name') + ' ' + client.get('isNew'));  
        return !client.get('isNew');
    });                   
    controller.set('content',clients);  
4

2 に答える 2

2

これについてはいくつかの方法があります:

第 1 に、クライアントのリストを処理するルート/状態が、別の無関係な状態 (つまり、newClient 状態) から残ったジャンクをフィルターで除外する必要があるため、非常に面倒です。newClient 状態を終了する前にジャンク レコードを削除した方がよいと思います。

if(client.get("isNew")) {
  client.deleteRecord();
}

これにより、clientIndex ルートや、ジャンク レコードを除外するために余分な作業を行う必要のないその他のクライアント リスト ルートに忍び込むことがなくなります。このコードは、ルーターが別の状態に移行する前にレコードを削除できるようにexit、ルートの関数に配置するのが理想的です。newClientClient.find()

しかし、さらに優れた慣用的な解決策があります: https://gist.github.com/4512271

(使用しているルーターのバージョンはわかりませんが、これは両方に適用されます)

createRecord()解決策は、トランザクションを使用することです: を直接呼び出す代わりに、トランザクションClientを呼び出しcreateRecord()て、新しいクライアント レコードがそのトランザクションに関連付けられるようにします。その後、必要なのは transaction.rollback() を呼び出すことexitだけです。クライアント レコードが保存されていれisNewば、それは明らかにロールバックされません。

これは、レコードを編集するための便利なパターンでもあります。1)enter状態でトランザクションを作成し、それにレコードを追加します。

enter: function(router, client) {
     this.tx = router.get("store").transaction();
     this.tx.add(client); 
},

次に、状態で同じ種類のものexit

exit: function(router, client) {
     this.tx.rollback();
},

このようにして、ユーザーがフォームに入力してサーバーに送信すると、ロールバックは正しく/便利に何もしません。また、ユーザーがフォーム フィールドの一部を編集して途中で元に戻した場合、コールバックは保存されていない変更を元に戻すため、ルートexitにダーティ ゾンビ クライアントがポップアップ表示され、保存されていない変更が表示されることはありません。clientIndex

于 2013-01-12T11:55:52.650 に答える
1

100% 確実ではありませんが、ClientsController のコンテンツを次のように設定してみてください。

Client.filter(function(client){
  return !client.get('isNew'));
});

編集:これを機能させるには、最初に Client.find() でストアをロードする必要があります。

于 2013-01-09T23:24:49.743 に答える