【问题标题】:AngularJS - Using $resource and interact with a RESTful data sourceAngularJS - 使用 $resource 并与 RESTful 数据源交互
【发布时间】:2015-01-19 20:37:13
【问题描述】:

我的previous topic 出现问题,我无法使用我的服务。

在做了一些研究之后,我终于找到了一种使用我的服务的方法。我仍然想知道为什么我使用 javascript 对象作为方法容器的其他方法没有成功。我有一些猜测,但找不到合适的解决方案。

希望你们能带领我走上正确的道路。

controller.js(工作解决方案)

angular.module('TodoApp.controllers', []).
controller('listCtrl', function ($scope, $location, todoApiService) {
    $scope.todos = todoApiService.query();
});

services.js(工作解决方案)

angular.module('TodoApp.services', []).
    factory('todoApiService', function ($resource) {
            return $resource('/api/todo/:id', { id: '@id' }, { update: { method: 'PUT' } });
    });

controllers.js(不工作的解决方案)

angular.module('TodoApp.controllers', []).
    controller('listCtrl', function ($scope, $location, todoApiService) {
        $scope.todos = todoApiService.getMyTodos.query();
    });  

services.js(不工作的解决方案)

angular.module('TodoApp.services', []).
    factory('todoApiService', function () {
        var todoApi = {};

        todoApi.getMyTodos = function ($resource) {
            return $resource('/api/todo/:id', { id: '@id' }, { update: { method: 'PUT' } });
        };

    return todoApi;
});

【问题讨论】:

  • 在第二个 service.js 中,Angular 的注入是否会为 $resource 启动?
  • Jep,它在 services.js 中启动。
  • 实际上,它从未真正进入方法“getMyTodos”。无法在 return $resource 语句处到达我的断点 ..
  • 如果我在 todoApiService.query() 方法处设置断点并尝试单步执行该方法,我会得到这个更新函数,而“克隆”对象未定义oi58.tinypic.com/2z6rqyv.jpg

标签: javascript html angularjs visual-studio-2013


【解决方案1】:

您应该:
$resource 注入您的工厂函数,就像您在工作版本中所做的那样。然后您可以删除$resource 作为getMyTodos 的参数。

angular.module('TodoApp.services', []).
    factory('todoApiService', function ($resource) {
        var todoApi = {};

        todoApi.getMyTodos = function () {
            return $resource('/api/todo/:id', { id: '@id' }, { update: { method: 'PUT' } });
        };

    return todoApi;
});

然后从控制器:

angular.module('TodoApp.controllers', []).
    controller('listCtrl', function ($scope, $location, todoApiService) {
        $scope.todos = todoApiService.getMyTodos().query();
    });

或者,您可以将控制器中的 $resource 传递给 getMyTodos(在将其注入控制器之后) - 这样您的控制器将如下所示:

angular.module('TodoApp.controllers', []).
    controller('listCtrl', function ($scope, $location, todoApiService, $resource) {
        $scope.todos = todoApiService.getMyTodos($resource).query();
    });

我没有检查这是否有效,但它应该 :)

【讨论】:

  • 非常感谢,它成功了。添加括号是有道理的,尽管它看起来有点奇怪.. ;)
  • 嗯,这是一个返回资源的方法。因此,您必须调用它才能获取要查询的资源。您可以使用 getter 来实现它(如果括号真的让您烦恼的话),但那是另一回事,它不是 getter 的正确用例。
猜你喜欢
  • 1970-01-01
  • 2012-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多