2015-08-17 92 views
1

我刚开始使用$resource来检索数据,并且在执行自定义操作时遇到问题。标准GET正在使用如下的对象ID;

pageContentService.get({ pageId: 1 }, function (data) { 
    vm.pageContent = data.content; 
}); 

我也希望能够使用字符串检索相同的数据如下;

pageContentService.getByPageName({ pageName: "Home" }, function (data) { 
    vm.pageContent = data.content; 
}); 

我的$resource服务是;

(function() { 
    "use strict"; 

    angular 
    .module("common.services") 
    .factory("pageContentService", ["$resource", pageContentService]); 

    function pageContentService($resource) { 
     return $resource("/api/pageContent/:pageId", null, 
      { 
       "getByPageName": { method: "GET", url: "/api/pageContent/:pageName", isArray: false } 
      }); 
    }; 
})(); 

而且我嘲笑后端如下;使用“PAGEID”何时返回数据。但是,它不会出现在后面的代码执行服务的“getByPageName”行动

(function (undefined) { 
    "use strict"; 

    var app = angular.module("pageContentServiceMock", ["ngMockE2E"]); 

    app.run(function ($httpBackend) { 
     var content = [ 
      { "pageId": 0, "pageName": "Unknown", "content": "<h1>Page not found</h1>" }, 
      { "pageId": 1, "pageName": "Home", "content": '<h1>Home Page</h1>' }, 
      { "pageId": 2, "pageName": "Programs", "content": '<h1>Programs Page</h1>' } 
     ]; 

     var contentUrl = "/api/pageContent"; 
     $httpBackend.whenGET(contentUrl).respond(content); 

     var contentById = new RegExp(contentUrl + "/[0-9][0-9]*", ''); 
     $httpBackend.whenGET(contentById).respond(function (method, url, data) { 
      var pageContent = content[0]; 
      var parameters = url.split("/"); 
      var length = parameters.length; 
      var pageId = parameters[length - 1]; 

      if (pageId > 0) { 
       for (var i = 0; i < content.length; i++) { 
        if (content[i].pageId == pageId) { 
         pageContent = content[i]; 
         break; 
        } 
       } 
      } 
      return [200, pageContent, {}]; 
     }); 

     var contentByName = new RegExp(contentUrl + "/[a-z][A-Z]*", ''); 
     $httpBackend.whenGET(contentByName).respond(function (method, url, data) { 
      var pageContent = content[0]; 
      var parameters = url.split("/"); 
      var length = parameters.length; 
      var pageName = parameters[length - 1]; 

      if (pageName.length > 0) { 
       for (var i = 0; i < content.length; i++) { 
        if (content[i].pageName == pageName) { 
         pageContent = content[i]; 
         break; 
        } 
       } 
      } 
      return [200, pageContent, {}]; 
     }); 
    }); 
})(); 

的代码按预期工作。

根据我的理解,自定义操作用于扩展标准$resource方法的现有功能,因此我认为我没有正确实施它。

回答

0

你可以用这样的尝试:

angular.module('common.services').factory('pageContentService', ['$resource', 
    function($resource) { 
     return { 
      getByPageName: $resource('/api/pageContent/:pageName', {pageName: '@pageName'}, { method: "GET", isArray: false }), 
      getByPageId: $resource('/api/pageContent/:id', {id: '@id'}, { method: "GET", isArray: false }) 
     }; 
    } 
]); 

并在控制器注入pageContentService您可以通过检索数据后:

pageContentService.getByPageName({ pageName: "Home" }, function (data) { 
    vm.pageContent = data.content; 
}); 

或者:

pageContentService.getByPageId({ id: 1 }, function (data) { 
    vm.pageContent = data.content; 
}); 
+0

按照您的建议修改了代码,但是当使用'pageContentService.getByPageId({pageId:1},function(data){vm.pageContent = data.content;})调用getPageById或getPageByName'时,或者'pageContentService.getByPageName({pageName:“Home”},function(data){vm.pageContent = data.content;});'。注意:我改变了'getPageById'来使用'pageId',所以它与'getPageByName'一致。 –

+0

你确定你可以用这个URL做GET吗? '/ API/pageContent /:pageName' –

0

的问题原来是在嘲弄。我正在使用;

var contentByName = new RegExp(contentUrl + "/[a-z][A-Z]*", ''); 

当我应该使用;

var contentByName = new RegExp(contentUrl + "/[a-zA-Z]+", ''); 

一旦我固定,我可以使用;

pageContentService.get({ pageId: 1 }, function (data) { 
    vm.pageContent = data.content; 
}); 

使用默认的“GET”或者“

pageContentService.getByPageName({ pageName: "Home" }, function (data) { 
    vm.pageContent = data.content; 
}); 

使用自定义操作。我也尝试使用Michelem的建议;

function pageContentService($resource) { 
    return { 
     "getByPageId": $resource('/api/pageContent/:pageId', null, { method: "GET", isArray: false }), 
     "getByPageName": $resource('/api/pageContent/:pageName', null, { method: "GET", isArray: false }) 
    }; 
} 

但我无法得到这个工作。