19

現在、REST + AngularJS アプリケーションに取り組んでいます。

リソース保存アクションの約束に関して少し問題があります。

私の工場:

App.factory('Course', function($resource) {
    var course = $resource('/AppServer/admin/courses/:courseId', {}, {});

    course.findAll = function() {
        return course.query();
    };

    course.findById = function(id) {
        return course.get({
            courseId : id
        });

    };

    course.saveCourse = function(course) {
        return course.$save();
    }

    return course;
});

私のコントローラー:

App.controller('CourseEditController', function($scope, $routeParams, $location, Course, FlashMessage) {
    // load course into edit form
    $scope.course = Course.findById($routeParams.courseId);

    // save edited course and print flash message
    $scope.saveCourse = function() {
        var savedCourse = Course.saveCourse($scope.course);

        savedCourse.$then(function(httpResponse) {
            FlashMessage.set("Die Änderungen am Kurs <i>" + savedCourse.title + "</i> wurden erfolgreich gespeichert.");
            $location.path("/kurse/verwalten");
        });
    }
}); 

問題は、次の例外が発生することです。

TypeError: Cannot call method '$then' of undefined

奇妙なことに、ファインダーの 1 つ (findById など) に同じ then-callback を追加すると、すべて正常に動作します。ただし、「return course.get({courseId:id});」の戻り値と比較して、「return course.$save()」の戻り値は未定義です。これが「オブジェクト オブジェクト」です。

私が望むのは、保存アクションが完全に実行されたときに FlashMessage を設定することです。

これに関するアイデアはありますか?REST サービスからの応答は正しいです。保存されたオブジェクトを返します。

マークに挨拶

4

5 に答える 5

3

リソースに関するAngularドキュメントを見ると、言及されています

$resource オブジェクト メソッドを呼び出すと、すぐに空の参照 (isArray に応じてオブジェクトまたは配列) が返されることに注意してください。サーバーからデータが返されると、既存の参照に実際のデータが取り込まれます。

これは、$save を呼び出すと空の参照が返されることを意味している可能性があります。またthen、リソースがベースではないため、Angular 1.2 より前の Resource API では使用できませんpromise

メソッド呼び出しを変更してsaveCourse、成功のために関数パラメーターを受け入れ、そこで必要なアクションを実行する必要があります。

于 2013-06-16T12:03:35.877 に答える
0

リソースがCRUD操作を実行するときにプロミスを持つことができるように、コントローラーにメソッドを追加しました。

方法は次のとおりです。

function doCrudOpWithPromise(resourceInstance, crudOpName){
            var def=$q.defer()
            resourceInstance['$'+crudOpName](function(res){def.resolve(res)}, function(err){def.reject(err)})
            return def.promise
}

呼び出しの例は次のとおりです。

var t=new MyResource()
doCrudOpWithPromise(t,'save').then(...)
于 2013-10-13T07:25:25.353 に答える
0

これは返信が遅れていますが、$save で callabck を使用できます...

var savedCourse = Course.saveCourse($scope.course);

savedCourse.$save(function(savedCourse, putResponseHeaders) {
    FlashMessage.set("Die Änderungen am Kurs <i>" + savedCourse.title + "</i> wurden erfolgreich gespeichert.");
    $location.path("/kurse/verwalten");
});
于 2013-10-24T10:01:08.750 に答える