2015-08-17 127 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 }) 
    }; 
} 

但我無法得到這個工作。