gpt4 book ai didi

angularjs - 为什么 Angular $resource 返回一个 Resource 对象而不是类对象?

转载 作者:行者123 更新时间:2023-12-05 01:00:52 25 4
gpt4 key购买 nike

使用 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})

如果我打印 result , 我可以看到:
Resource {id: 1, details: 'somestuff'}

相比之下,我希望拥有:
MyObject {id: 1, details: 'somestuff'}

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

难道我做错了什么?

提前致谢。

最佳答案

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

  • 有一个Resource在工厂内部创建的函数(即 $resource 提供程序)并在 $resource 时返回叫做。

  • 资源具有以下结构(假设我们只想对它具有什么方法而不是每个方法的作用有一个高级 View )
    function Resource(value) { ... }
    Resource.prototype.toJSON = function () { ... }
    Resource.prototype.bind = function () { ... }
  • 我还看到 $resource函数在第三个参数中接收要在 Resource 上设置的附加 Action (与一些默认 Action 合并)。函数,我看到你正在发送一个额外的 update方法,因此对象具有以下结构

  • 合并 update使用默认操作:
    {
    'get': {method: 'GET'},
    'save': {method: 'POST'},
    'query': {method: 'GET', isArray: true},
    'remove': {method: 'DELETE'},
    'delete': {method: 'DELETE'},
    // added by the user
    update: { method: 'PUT' }
    }
    $resourceResource 上为该散列的每个属性设置一个方法函数以及 Resource 的原型(prototype)附加一个 $在方法名称之前,即
    Resource.get = function () { ... }
    Resource.save = function () { ... }
    Resource.update = function () { ... }
    ...

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

    现在返回到您的代码,您正在扩展一个新函数 MyObject来自 MyObjectResource在哪里 MyObjectResource是调用 $resource 的结果即 Resource上面看到的函数,coffeescript 的 extend实际上会复制 MyObjectResource 上定义的所有属性至 MyObject并隐藏 [[Prototype]] MyObject.prototype 的属性(property)指向 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 this 不是 MyObjectResource Source 的实例时才会发生),如果我们这样做 new MyObjectResource()无法访问 someMethod因为这实际上是在“子类”中定义的。

    但是我们可以创建 MyObject 的实例并且由于 CoffeeScript 的 extend 创建的链接该实例可以访问相同的 get通过 MyObjectResource.prototype.$get , 所以:
    var instance = new MyObject()
    instance.$get({id: 1}); // works because of the link created between the prototypes
    instance.someMethod(); // also works

    关于angularjs - 为什么 Angular $resource 返回一个 Resource 对象而不是类对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28795680/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com