5

データを表示するためのディレクティブを作成しました。私はそれをng-repeatに組み込み、モデルが接続されていることを確認することができます。クリックしてページを戻すと、以前に変更されたデータが再び表示されます。私は、ngResourcesを使用してAPIからデータをロードしました。これまでのところ、とてもうまくいきました。期待どおりに動作します。保存すると項目が消えます

私は、ディレクティブでAPIにデータを保存すると、ページからアイテムが消えます(具体的には、フィールドは空白で描画されます)。残りのアイテムは以前と同じように残ります。保存されたものだけが変更されます。ここで

ディレクティブです:

.directive('action', function() { 
    return { 
     restrict: 'E', 
     scope: { 
      data:'=model' 
     }, 
     templateUrl: 'modules/actions/view.tpl.html', 
     replace: true, 
     link: function(scope, element, attr) { 
      scope.save = function() { 
       console.log(" data to save:" + JSON.stringify(scope.data)); 
       scope.data.$save(); 
      } 
     } 
    }; 
}) 

ディレクティブに関連付けられたHTMLが含まれています:

<div ng-repeat="item in data"> 
    <action model="item" /> 
</div> 

ここで追加のコンテキストを示しfiddleです:

<p><input type="text" ng-model="data.assignee" ng-change="save()"> 

ここで使用ディレクティブはどのようです。いくつかの偽のデータで動作する基本ディレクティブを見ることができます。 API呼び出しのコードはコメントアウトされています。

また、問題は、scope.data.$save();行のコメントが外されている場合に発生します。 ng-repeatに表示された項目が自分自身を保存しようとすると、表示されている項目のリストから消え、空白の項目で置き換えられます。アプリケーション全体をリロードすると、APIの保存が成功し、項目が正しく表示されるようになりました。

私が起こっていると思われるのは、セーブコールが正しい項目で動作していて、おそらくプロトタイプの継承のために、変更された項目を新しい空白のものに置き換えるということです。保存すると親スコープが更新され、リストが再描画され、新しい空白のアイテムが表示されます。

誰かが何が起こっているのか、それを修正する方法を明確にすることはできますか?

答えて

4

$save()コマンドへのHTTP応答が空のデータを戻していることがわかりました。

これは$resourceの動作方法です。 $save()に電話すると、(デフォルトで)HTTP POSTでRESTサービスが呼び出されます。応答は、リソースのサーバー状態であると予想されます。結果はオブジェクトにコピーされます。この場合、私はあなたのRESTサービスが空のオブジェクトを返すと推測しています。

つまり、本体が{name: 'foo'}のPOSTを送信した場合、サーバーからの応答は{id: 44, name: 'foo', extraInfoServerCreated: 'bar'}のようになります。

+1

あなたはそうです。サーバーが保存されたデータを戻すようにすれば、問題は完全に解決されます。ありがとう! – CodeGuy2001

+0

また、応答データの代わりに元の項目を使用する方が簡単な場合は空白の応答を返す – cyberwombat

+0

@Yashua本当ですか?私はAngular '$ resource'がRESTサービスから返ってきたものでデータを置き換えると思っていました。もしあなたが空に戻ると、あなたのモデルはクリアされます。 –

関連する問題