2014-02-13 124 views
0

我正在寻找一种正确的方式来处理可以通过不同的资源URL获取的数据类型。请参阅下面的代码示例:具有不同资源URL的相同数据类型(AngularJS)

storeServices.factory('Booklist', ['$resource', 
    function($resource){ 
     return $resource('http://some.domain.com/api/stores/:storeId/booklists/', 
      {}, { 
      query: {method:'GET', params:{storeId:'@storeId'}, isArray:true} 
     }); 
    }, 
]); 

但是另外还有另一个API用于获取书籍列表,而无需指定storeId。例如:

http://some.domain.com/api/booklists/ 

我应该使用不同的名称创建不同的工厂还是有更好的/正确的方法?在此先感谢任何回复。

回答

0

绝对可以使用相同的$ resource来调用这两个不同的端点,但是如果这两个资源/端点是相同类型的(为了使用相同的$资源工厂消耗),这是有问题的。

要做到这一点你需要进行参数的嵌套资源,使完整的URL可以动态地在运行时被构建:

PLUNKER

app.controller('MainController', function($scope, Booklist) { 

    // Sends request to http://some.domain.com/api/stores/1/booklists/ 
    $scope.withStoreId = Booklist.query({storeId: 1, level1: 'stores'}); 

    // Sends request to http://some.domain.com/api/booklists/ 
    $scope.withStoreId = Booklist.query(); 

}); 

app.factory('Booklist', ['$resource', 
    function($resource){ 
    return $resource('http://some.domain.com/api/:level1/:storeId/booklists/', 
     {}, { 
     query: { 
     method:'GET', 
     params: { 
      storeId: '@storeId' 
     }, 
     isArray: true 
     } 
    }); 
    } 
]); 
+0

感谢快速的回应。在你的代码中,还有一个问题应该是“params:{storeId:'@storeId'}”还包括level1:'@ level1'? –

+0

这不是必须的,因为'level1'不是你会在'booklist'对象内找到的东西。 – Stewie

+0

谢谢。我对ng还不熟悉,请耐心等待。我的印象是资源内的参数,例如:../:level1 /:storeId/...从参数中获取它们的值:{storeId:'@storeId',...}。现在我想我实际上不明白它是如何工作的。那么是不是params:{}应该有属于返回对象的属性? –

相关问题