【问题标题】:$resource callback with saved value具有保存值的 $resource 回调
【发布时间】:2013-11-30 02:41:40
【问题描述】:

我刚刚开始使用 AngularJS,我喜欢它。

但是 - 我需要使用 $resource 将项目保存到我的数据库中,然后返回包含数据库中新创建项目的值的对象(尤其是数据库分配的 ID)。

我找到了几篇描述这一点的文章 - 但它们似乎都不适合我:(

我有一个非常简单的设置:

var app = angular.module("todoApp", ['ngResource', 'ngAnimate']);
app.factory("TodoFactory", function ($resource) {
    return $resource('.../api/todo/:id', { id: '@id' }, { update: { method: 'PUT' }});
});

var todoController = app.controller("TodoController", function ($scope, TodoFactory) {

$scope.todos = [];

init();

function init() {
    $scope.todos = TodoFactory.query();
}

$scope.addTodo = function () {
    TodoFactory.save($scope.item, function () {
        // Success
        console.log($scope.item); // <--- HERE'S MY PROBLEM
        $scope.todos.push($scope.item);
        $scope.item = {};
    },
    function () {
        // Error 
    });
};

但是当我调用 TodoFactory.save 时,$scope.item 不包含数据库中的 Id 属性 - 只有它在调用 save 时具有的值。

如何让我的设置返回包含所有数据库生成值的更新对象?

如果有人能指出我正确的方向,将不胜感激:)

更新:我刚刚查看了我提供的 API 的源 - 保存方法不会更新插入的对象。 在我解决了这个“小”问题之后,和平人的例子就像一个魅力。

很抱歉给大家带来不便 - 但非常感谢您的回复! :)

【问题讨论】:

    标签: javascript angularjs callback


    【解决方案1】:

    TodoFactorysave 方法不会更新$scope.item,而是使用保存的对象作为参数调用回调函数,其中包含新的id。

    所以你必须更换

    $scope.addTodo = function () {
        TodoFactory.save($scope.item, function () {
            // Success
            console.log($scope.item); // <--- HERE'S MY PROBLEM
            $scope.todos.push($scope.item);
            $scope.item = {};
        },
        function () {
            // Error 
        });
    };
    

    $scope.addTodo = function () {
        TodoFactory.save($scope.item, function (savedTodo) {
            // Success
            console.log(savedTodo);
            $scope.todos.push(savedTodo);
            $scope.item = {};
        },
        function () {
            // Error 
        });
    };
    

    此行为记录在 ngResource.$resource

    【讨论】:

    • 我已经阅读了 ngResource.$resource 文档 - 但我无法让它工作。我想我只是在我的代码中遗漏了一点点 - 但对于我的生活,我无法弄清楚在哪里 :) 我能够让我的对象返回 - 但它只是我传入的同一个对象 - 它不包含数据库生成的值 :(
    【解决方案2】:

    这应该可以解决问题。

    $scope.addTodo = function () {
    
    // ADD IN A VARIABLE FOR THE RESPONSE DATA AS THE PARAMETER TO YOUR SUCCESS CALLBACK FN
    TodoFactory.save($scope.item, function (responseItem) {  
        // Success
        console.dir(responseItem);   // <--- AND THEN USE IT
        $scope.todos.push(responseItem);
        $scope.item = {};
    },
    function () {
        // Error 
    });
    };
    

    【讨论】:

      猜你喜欢
      • 2016-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多