加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

angularjs – 为什么Angular $资源返回一个Resource对象而不是类

发布时间:2020-12-17 17:24:53 所属栏目:安全 来源:网络整理
导读:使用CoffeeScript,Angular和$resource,我创建了以下工厂: angular.module('myapp',['ngResource']).factory 'MyObject',['$resource',($resource) - MyObjectResource = $resource '/api/my_object/:id',{ id: '@id' },{ update: method: 'PUT' } class MyO
使用CoffeeScript,Angular和$resource,我创建了以下工厂:

angular.module('myapp',['ngResource']).factory 'MyObject',['$resource',($resource) ->
    MyObjectResource = $resource '/api/my_object/:id',{
      id: '@id'
    },{
      update:
        method: 'PUT'
    }

    class MyObject extends MyObjectResource

      someMethod: ->
        dosomething
 ]

问题是,当我从API加载一个对象时,我得到一个Resource对象而不是MyObject对象,这是一个问题,因为我无法访问其他方法.

这是我获取对象的代码:

result = MyObject.get({id: 1})

如果我打印结果,我可以看到:

Resource {id: 1,details: 'somestuff'}

相比之下,我希望有:

MyObject {id: 1,details: 'somestuff'}

这将使我能够访问someMethod以及我为此类定义的所有其他方法.

难道我做错了什么?

提前致谢.

解决方法

快速查看源代码后,我看到以下关系:

>在工厂内部创建了一个Resource函数(它是$resource provider),并在调用$resource时返回.

资源具有以下结构(让我们想象一下,我们只想获得它所拥有的方法的高级视图,而不是每个方法的工作方式)

function Resource(value) { ... }
Resource.prototype.toJSON = function () { ... }
Resource.prototype.bind = function () { ... }

>我还看到$resource函数在第3个参数中接收要在Resource函数上设置的附加动作(与某些默认动作合并),我看到你正在发送一个额外的更新方法,所以对象有以下结构

将更新与默认操作合并:

{
  'get': {method: 'GET'},'save': {method: 'POST'},'query': {method: 'GET',isArray: true},'remove': {method: 'DELETE'},'delete': {method: 'DELETE'},// added by the user
  update: { method: 'PUT' }
}

$resource为Resource函数以及在方法名称之前附加$的Resource的原型设置一个方法,即

Resource.get = function () { ... }
Resource.save = function () { ... }
Resource.update = function () { ... }
...

Resource.prototype.$get = function () { ... }
Resource.prototype.$save = function () { ... }
Resource.prototype.$update = function () { ... }
...

现在回到你的代码,你从MyObjectResource扩展一个新函数MyObject,其中MyObjectResource是调用$resource的结果,即上面看到的Resource函数,coffeescript的extend实际上将MyObjectResource上定义的所有属性复制到MyObject,并使隐藏[ [Prototype]] MyObject.prototype的属性指向MyObjectResource.prototype:

MyObjectResource                
  prototype     ------->  MyObjectResource.prototype
                            $get
  get                       $save
  save                      toJSON
  ...                       ...
                             ^
                             |
MyObject                     |
  prototype     ------->  MyObject.prototype
  get (reference)           someMethod
  set (reference)
  ...

这就是你可以做MyObject.get的原因,因为它现在有一个对MyObjectResource.get的引用,即MyObject.get === MyObjectResource.get

这是有趣的部分,调用MyObject.get会返回一个MyObjectResrouce的实例(这实际上是被编码的,但只有在MyObject.get内部才会发生,这不是MyObjectResource Source的实例),如果我们做新的MyObjectResource()则无法访问someMethod因为它实际上是在“子类”中定义的.

但是我们可以创建一个MyObject实例,并且由于coffeescript的扩展创建了链接,实例可以通过MyObjectResource.prototype访问相同的内容.$get,所以:

var instance = new MyObject()
instance.$get({id: 1});     // works because of the link created between the prototypes
instance.someMethod();      // also works

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读