2013-10-18 48 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); 
    } 
]);