【问题标题】:Suppressing methods from ngResource抑制来自 ngResource 的方法
【发布时间】:2014-03-01 22:49:42
【问题描述】:

ngResource 看起来是一种在 RESTful(或至少受 REST 启发)Api 中管理数据访问的非常方便的方法......但我想使用它管理的一些数据是只读的(至少从我的应用程序的视角)。

有什么办法可以防止ngResource返回的对象添加save、remove和delete方法?就文档而言,它看起来像是一个唯一的附加 API...

【问题讨论】:

    标签: angularjs ngresource


    【解决方案1】:

    代替:

      var Car = $resource('/cars');
      var myCar = new Car();
      myCar.color = 'red';
      myCar.$save();
    

    做:

      var Car = $resource('/cars');
      var myCar = {};
      myCar.color = 'red';
      Car.save(myCar);
    

    还有:

      var Car = $resource('/cars/:id');
      var myCar = Car.query({id: 52});
    

    那么您将永远不必看到那些$-methods/properties。

    【讨论】:

    • 在第二次阅读时,我想我误解了你的意思。你想要的是 not 是任何方法,如Car.save Car.delete 等。我不知道如何,但我非常想自己替换默认方法。我现在也在调查...
    【解决方案2】:

    我认为这不可能,因为源代码如下所示:

     var DEFAULT_ACTIONS = {
        'get': {method: 'GET'},
        'save': {method: 'POST'},
        'query': {method: 'GET', isArray: true},
        'remove': {method: 'DELETE'},
        'delete': {method: 'DELETE'}
      };
    

    和:

        actions = extend({}, DEFAULT_ACTIONS, actions);
    
        function extractParams(data, actionParams) {
          var ids = {};
          actionParams = extend({}, paramDefaults, actionParams);
          forEach(actionParams, function(value, key) {
            if (isFunction(value)) {
              value = value();
            }
            ids[key] = value && value.charAt && value.charAt(0) == '@' ?
              lookupDottedPath(data, value.substr(1)) : value;
          });
          return ids;
        }
    
        function defaultResponseInterceptor(response) {
          return response.resource;
        }
    
        function Resource(value) {
          shallowClearAndCopy(value || {}, this);
        }
    
        forEach(actions, function(action, name) {
        ...
    

    对于 Angular 来说是一个很好的补充,让我们将来可以修改 DEFAULT_ACTIONS。同时你可以通过...快速修复它。

      var myResource = $resource('/myresource');
      delete myResource.save;
      delete myResource.delete;
      delete myResource.remove;
      delete myResource.query;
    

    ...我猜;虽然这有点“脏”。

    【讨论】:

    • 不需要两个答案。只需更新/编辑您的第一个答案。
    【解决方案3】:

    你只需要从构造函数原型中移除实例方法:

    PLUNKER

    app.factory('SomeResource', function($resource){
    
      var r = $resource('/some/api/path');
    
      delete r.prototype.$save;
      delete r.prototype.$delete;
      delete r.prototype.$remove;
    
      return r;
    
    });
    

    【讨论】:

    • 我早该想到的!非常感谢。
    • 不要忘记 also delete 按照下面的@kornfride 构造函数上的非前缀方法,例如delete r.save; delete r.prototype.$save
    猜你喜欢
    • 1970-01-01
    • 2015-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-18
    • 1970-01-01
    • 1970-01-01
    • 2011-08-29
    相关资源
    最近更新 更多