2013-10-18 119 views
1

試圖採取一個URL,並在AngularJS控制器重定向該請求到最佳位置獲取JSON數據。 VideoSearchCtrl綁定到搜索表單。生成的url對模板是正確的,所以我使用控制器將其重定向到json數據的位置。AngularJS,創建資源哈希

GuideControllers.controller('VideoSearchCtrl', ['$scope', 'VideoSearch', 
    function($scope, VideoSearch) { 
     var pattern = new RegExp(".*/search\\?=(.*)"); 
     var params = pattern.exec(document.URL)[1];//redirect to videos to execute the search for the data 
     $scope.videos = VideoSearch.query({ resource: "videos", action: "search", q: params }); 
    } 
]); 

這會發送/ videos/search?q = xyz進入查詢。工廠創建資源:

var VideoSearchServices = angular.module('VideoSearchServices', ['ngResource']); 

VideoSearchServices.factory('VideoSearch', ['$resource', 
    function($resource){ 
     return $resource("/:resource/:action:params", {resource: "@resource", action: "@action", params: "@params"}, { 
      query: { 
       isArray: true, 
       method: "GET", 
       headers: { 
        "Accept": "application/json", 
        "X-Requested-With": "XMLHttpRequest" 
       } 
      } 
     }); 
    } 
]); 

但服務器獲得AS /視頻/搜索%FQ = XYZ,沒有/視頻/搜Q = XYZ,因此,「秀」的方法被調用,而不是網址是什麼?一個自定義的「搜索」動作。顯然有一些逃跑的地方?或者,也許「?」也是資源工廠尋找的特殊模式?對於那些習慣了AngularJS或JavaScript的人來說,這可能很明顯。

我有一個搜索模板,並從另一個位置檢索json。這兩個工作,但我不能要求與上述代碼的JSON。

回答

1

首先,這樣做:

return $resource("/:resource/:action", {resource: "@resource", action: "@action"}, { 

然後:

$scope.videos = VideoSearch.query({ resource: "videos", action: "search", q: params }); 

的一點是params是不是你要聲明的資源的URL的一部分,你只需要聲明resourceaction然後你添加所有路線的自然參數

+0

明白了,謝謝。其實你需要從「params」中排除「?=」,所以正則表達式已經在我的問題中更新了。資源查詢將添加「?=」,只需傳遞鍵值對即可。 – pferrel

+0

是params只是一個對象 – apneadiving

+0

爲什麼你不接受答案,因爲它回答? – apneadiving

0

實際上有更好的方法來做到這一點與Angular的$ location和jQuery的分機結束應該與任何未來的參數一起工作。只需將新的參數添加到查詢工廠。

GuideControllers.controller('VideoSearchCtrl', ['$scope', '$location', 'VideoSearch', 
    function($scope, $location, VideoSearch) { 
     var route = jQuery.extend(
     { resource: "videos", action: 'search' }, 
     $location.search() 
    ); 
     $scope.videos = VideoSearch.query(route); 
    } 
]);