-1

私は次のような非常に単純なリソースを持っています:

angular.module('ExampleServices', ['ngResource']).

        factory('NoteService', function($q, $rootScope, $resource){
        var baseurl = "/api/v1/note/";
        var Note = $resource(baseurl, {}, {

            // get notes method    
            get_for_model: {
                method: 'GET',
                params:{user: '', object_id: ''},
                isArray: false
            },

            // leave note method
            leave_note: {
                method: 'POST',
            }

        });
        return Note
    }
);

そして、コントローラー内でleave_note次のようにメソッドを呼び出します。

$scope.note = function(){
        $scope.note = NoteService.leave_note({
            desc: desc,
            title: title,
            object_id: oid,
        }); 
    }

これは基本的に、アプリケーションのREST APIに対してPOSTメソッドを呼び出し、オブジェクトが作成されます。ページが更新されると、にリストされているメモが表示されますnotes。しかし、私の知識$resourceに関しては、それ自体でビューを更新する必要があります。

ドキュメントからの引用

$ resourceオブジェクトメソッドを呼び出すと、すぐに空の参照(isArrayに応じてオブジェクトまたは配列)が返されることを理解することが重要です。サーバーからデータが返されると、既存の参照に実際のデータが入力されます。

関数として定義するまで$rootScope.$apply、メソッド内で使用することはできません(次のように:)leave_note

leave_note: function(){
    var note = New Note();
    note.desc = desc;
    note.title = title;
    note.object_id = oid;
    note.$save();
    $rootScope.$apply();
}

ただし、上記の場合、RESTAPIに送信する呼び出しにはundefinedリクエストメソッドがあります。

私が考えることができるもう1つの問題は、$scope.note定義していないが$scope.notes、RESTAPIによって送信されるメモのリストであるということです。$scope.note更新されている可能性がありますが、オブジェクトをレンダリングしていないので、noteテンプレートをnotes使用してレンダリングしているため、テンプレートの変更を確認できません。ng-repeat

また、新しいメモが保存されたら、notesオブジェクトを再フェッチしようとしましたが、基本的にすべてのメモが削除され、見苦しい(ほとんどページの更新のように)すべてのメモが再レンダリングされます。

私が達成しようとしているのは、noteオブジェクトが保存されるとすぐに、新しいメモを既存のメモにマージすることです。案内してください。ありがとう

4

1 に答える 1

1

あなたは使用する必要はありません$rootScope.$apply、あなたのミスは$resourceAPIドキュメントを理解しました。

$resourceドキュメントに記載されているように、「サーバーからデータが返されると、既存の参照に実際のデータが入力されます。」。これは、実行するときに、 GETリクエストから受信した(将来の)データを入力する$scope.notes = NoteService.get_for_model();ように要求していることを意味します。APIは、まさにそれを実行する責任があります-モデルを更新します-それ以上は何もしません。同じサービスでPOSTを実行すると、データが自動的に更新されることについては言及されていないことに注意してください。$scope.notesNoteService.get_for_model$resource$scope.notes

新しいメモ(POST)を追加した後にモデルを更新$scope.notesし、メモリスト全体を要求したくない場合は$scope.notes、POST成功コールバックでモデルに新しいメモを直接追加してみてください。

 var note = NoteService.leave_note({
            desc: desc,
            title: title,
            object_id: oid,
        }, function() {
            $scope.notes.push(note.$get());                
        }
 );

これは大幅に改善できることに注意してください(つまり、を回避します$get)が、実装の正確な詳細がわからないため、一般的なソリューションを提供しました。

于 2013-02-26T12:31:40.877 に答える