【问题标题】:How works the angular factory with parameter带参数的角度工厂如何工作
【发布时间】:2016-09-10 17:29:21
【问题描述】:

我正在阅读角度教程STEP 13 REST and Custom Services,但不确定是否理解正确。

这里创建一个工厂来封装$http。聪明的部分是有一个文件phones/phones.json 包含电话列表,phones/<phoneId>.json 文件包含每个电话的详细信息。

angular.
  module('core.phone').
  factory('Phone', ['$resource',
    function($resource) {
      return $resource('phones/:phoneId.json', {}, {
        query: {
          method: 'GET',
          params: {phoneId: 'phones'},
          isArray: true
        }
      });
    }
  ]);

因此,当他想要获取电话的完整列表时,使用Phone.query() 是有意义的,因为工厂调用Phone 并且里面有一个名为query: 的东西(该标签是如何调用的?方法?功能?)。由于没有任何参数作为参数,我phoneIdGET 声明中获取phones 的默认值。

angular.
  module('phoneList').
  component('phoneList', {
    templateUrl: 'phone-list/phone-list.template.html',
    controller: ['Phone',
      function PhoneListController(Phone) {
        this.phones = Phone.query();
        this.orderProp = 'age';
      }
    ]
  });

但现在最后一部分不知道如何工作。我知道从$routeParams 获得phone_id。但是Phones 工厂现在如何拥有get() 函数,为什么query() 没有时需要回调函数;

angular.
  module('phoneDetail').
  component('phoneDetail', {
    templateUrl: 'phone-detail/phone-detail.template.html',
    controller: ['$routeParams', 'Phone',
      function PhoneDetailController($routeParams, Phone) {
        var self = this;
        self.phone = Phone.get({phoneId: $routeParams.phoneId}, function(phone) {
          self.setImage(phone.images[0]);
        });    
      }
    ]
  });

所以我的三个问题是:

  • query的默认参数如何工作

  • 电话如何拥有get() 以及它如何接收参数

  • 为什么get() 需要回调函数而query() 不需要

【问题讨论】:

    标签: javascript angularjs json rest


    【解决方案1】:

    查询的默认参数如何工作?

    例如

    var Phones =  $resource('phones/:phoneId.json', {phoneId:'@myPhoneId'}
    

    如果我查询Phones.query({phoneId:12345}); 然后 Angular 将使用 url phones/12345.json 进行 HTTP#GET 调用。 这里 Angular 知道,它需要采用默认参数phoneId 值 通过从调用resource.{phoneId:12345}的get方法时传递的对象列表映射。 因此,您可以使用:paramName 指定默认参数。

    url和hash map对象中的参数名必须相同(本例为phoneId

    电话如何拥有 get() 以及它如何接收参数?

    资源对象具有默认的资源操作集。如果您在创建资源对象时定义,它还具有自定义操作。 默认操作:

    1. get    //call $http#GET method
    2. save   //call $http#POST method
    3. query  //call $http#GET  method
    4. remove //call $http#DELETE method
    5. delete //call $http#DELETE method
    

    为什么 get() 需要回调函数,而 query() 不需要?

    您可以拨打get(),无需回拨。

    每当返回响应时,您的资源对象(在本例中为 Phones)将自动填充。 你不需要回调。

    如果你需要做一些资源操作(save/delete..etc),需要之前调用的一些参数,你可以有回调。

    $resorcenot return promise。 Bu 上定义的默认方法return promise of the action 成功解决,错误拒绝。

    所以,你不能有承诺链。你需要回调。

    您可以从angular#$resource获得更多信息

    【讨论】:

    • so query 是自定义函数还是预定义函数?因为在您的解释中,您有两个 GET 方法。我想知道很奇怪的名字。我会选择类似getPhone()
    • 其预定义的默认操作
    • 我现在看到了,get 需要回调,因为除了设置 phone 详细信息数据之外,还想将图像设置为模型中的第一张图片?
    • 在您的示例中,当您使用{phoneId:'@myPhoneId'} 时,@myPhoneId 是什么?一个变量?我放置常量的占位符?
    • @myPhoneId 它是伪占位符,您将在其中放置常量值或变量
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-25
    • 1970-01-01
    • 1970-01-01
    • 2017-04-07
    • 1970-01-01
    相关资源
    最近更新 更多