Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angularjs 为什么我必须在$resource中使用$promise?_Angularjs_Ngresource - Fatal编程技术网

Angularjs 为什么我必须在$resource中使用$promise?

Angularjs 为什么我必须在$resource中使用$promise?,angularjs,ngresource,Angularjs,Ngresource,诚然,我对Angular比较陌生,但我在使用ngResource进行REST调用时遇到了麻烦 我遵循了一种工厂模式,这种模式似乎比较普遍 然而,我只能通过使用$PROMITE.then访问REST响应。我知道您不需要$resource 所以我有这个工厂 var LookupsService = angular.module('LookupsService', ['ngResource']); LookupsService.factory('Lookups', ['$resource', f

诚然,我对Angular比较陌生,但我在使用ngResource进行REST调用时遇到了麻烦

我遵循了一种工厂模式,这种模式似乎比较普遍

然而,我只能通过使用$PROMITE.then访问REST响应。我知道您不需要$resource

所以我有这个工厂

var LookupsService = angular.module('LookupsService', ['ngResource']);

LookupsService.factory('Lookups', ['$resource',
  function ($resource) {
      return $resource('http://localhost:5001/api/lookups', {});
  }]);
但这失败了(未定义)

但这很好

    Lookups.get()
        .$promise
        .then(function (lookups) {
            alert(lookups.foo);
        });
很明显,我遗漏了一些东西。某种小学生的错误;-)

更新


谢谢你的帮助,现在一切都很清楚了。我给@fikkatra打了个勾,以确保她的答案和片段清晰明了。但几乎所有的答案都很有用。我必须小心使用警报进行调试

您不必也不应该将
$promise
$resource
一起使用。
$resource
服务可以这样使用:

(function() {
  'use strict';

  angular
    .module('app')
    .factory('MyService', MyService);

  MyService.$inject = ['$resource'];

  function MyService($resource) {
    return $resource('my/url/:id', {id: "@id"}, {
      'query': { isArray: false },
      'update': { method: "put" }
    });
  }
})();
function getActionTypes(){
      MyService.query(
        function success(result){
          // do stuff with result
        },
        function failure(result){
          console.error(result);
        });
    }
它返回了几个HTTP方法,您可以在代码中使用这些方法,而无需自己编写它们。要使用它们,您可以执行以下操作:

(function() {
  'use strict';

  angular
    .module('app')
    .factory('MyService', MyService);

  MyService.$inject = ['$resource'];

  function MyService($resource) {
    return $resource('my/url/:id', {id: "@id"}, {
      'query': { isArray: false },
      'update': { method: "put" }
    });
  }
})();
function getActionTypes(){
      MyService.query(
        function success(result){
          // do stuff with result
        },
        function failure(result){
          console.error(result);
        });
    }

对承诺使用
alert
无效,即它不会显示承诺内的结果。但是,angular被设计为直接使用
$resource
服务绑定到作用域。这意味着您可以将
$resource
结果绑定到范围对象,并且angular将在应用绑定时考虑范围对象是承诺。这就是为什么
警报(resourceResult)
不起作用,但是
$scope.myObj=resourceResult(然后将其绑定到视图中)将起作用

插入代码片段以更清楚地解释问题:

var-app=angular.module('myapp',['ngResource']);
app.controller('myctrl',函数($scope,$resource){
//这行不通:
//警报(“不起作用:”+$resource(“)https://api.github.com/users/fikkatra“).get());
//但这会奏效的
$resource('https://api.github.com/users/fikkatra“).get().$promise.then(函数(用户){
警报(“将工作:+user.login”);
});
//将$resource result直接分配给范围将起作用:
$scope.user=$resource('https://api.github.com/users/fikkatra“).get();
});

{{user.login}
根据下面的代码片段,您可以传入一个成功回调

var User = $resource('/user/:userId', {userId:'@id'});
var user = User.get({userId:123}, function() {
  user.abc = true;
  user.$save();
});
资源完成时将调用success函数回调


或者,您可以将promise语法与
get()
一起使用,除非您不需要根据示例添加自己的promise。相反,您可以简单地执行以下操作:

 Lookups.get()
        .then(function (lookups) {
            alert(lookups.foo);
        });
这是因为
get()
返回一个承诺。当promise被成功评估时,
将调用()
,实际上您不必使用$promise,只要您愿意,它就可以使用

代码笔:


您还可以将.get()的结果分配给作用域上的一个变量,并在解析请求时填写结果(在上面的第一个示例中)。这适用于将数据分配给作用域中的对象,该对象最终将显示在页面上,但对于需要使用.get()的结果执行其他操作的其他情况,这可能不太适用。

Wow-一些非常好的响应非常快-谢谢!我要花一点时间来消化和结帐。。。