带复合键参数的ngResource查询

时间:2016-09-09 06:50:25

标签: angularjs ngroute

我有一个资源Answer,其中包含由QuestionnaireIdQuestionId组成的复合密钥。 ngResource代码如下:

function answerResource($resource) {
    return $resource("/api/answers/:questionnaireId/:questionId",
        {
            questionnaireId: "@questionnaireId",
            questionId: "@questionId"
        }
    );
}

我想使用问卷ID查询此资源并获取所有答案。如果我使用:

answerResource.query(
    {
        questionnaireId: questionnaireId
    }
);

然后请求的网址是:

/api/answers/123

当我想要它时:

/api/answers?questionnaireId=123

否则,我需要为查询搜索处理两个路由 - 一个在查询字符串中具有Id,另一个在ID作为url路径的一部分。 (我也有搜索文本的查询,其中问卷ID可能不存在,会使用/api/answers?q=sometext等网址。

当然,任何.query参数都应作为查询字符串传递,而不是作为路径的一部分传递。我如何获得所需的行为?

3 个答案:

答案 0 :(得分:2)

我可以提出的最佳选择是在资源上创建一个新的search方法,该方法在网址中没有参数:

// normal resource definition here...
,{
    search: {
        method: "GET",
        url: "/api/answers",
        isArray: true
    }
}

使用复合键值调用它会将它们作为查询字符串参数附加,而不是作为网址的一部分附加,例如/api/answers?questionnaireId=123

答案 1 :(得分:0)

面对类似的问题,但我搞乱了复合键(项目,序列) 1- html.erb:从https://spin.atomicobject.com/2013/11/22/pass-rails-data-angularjs/借来的选项2 这样我就可以从.jb脚本中获取我已经拥有的.erb表单中的项目(我正在根据请求使用angularjs进行某种“管理细节 - crud”)
2-在控制器.js文件中我使用document.getElementById和getAttribute从html元素中的自定义数据中获取值,并将其连接到请求:'/ item #personId ='+ div.getAttribute(“data-personId” )+ '&安培;格式= JSON'
在items_controller索引操作中,默认情况下rails g期望没有参数并抓取所有项目,然后我不得不问

如果params [:personId] .present?       @items = Item.where(personId:params [:personId])    其他       抢-所有项    端

这有效,但我不确定它是否是最佳方法,因为我是angularjs的真正新手。 只是搞乱这个问题,还不知道如何删除记录。

答案 2 :(得分:0)

$ resource crete path而不是querystring,因为你定义了占位符:

return $resource("/api/answers/:questionnaireId/:questionId"..

如果从资源级别删除它们,然后调用$resource.query({param: value}),则可以生成查询字符串,也可以为单个$ resource指定更多操作,以执行不同的请求覆盖操作url属性。

我创建了一个简单(且非常快)的示例可能有助于您理解:

工作示例:https://jsfiddle.net/Nedev_so/b71feyc6/19/

编辑: 在您发表评论后,我了解您的需求,所以

资源工厂:

 //only for example purpose
 var answersBaseUrl = "https://example.com/api/answers";

 var answerTemplateUri = commentsBaseUrl + '/:questionnaireId/:questionId'

 var params = {questionnaireId: '@_questionnaireId',questionId: '@_questionId'};

 var  res = $resource(answerTemplateUri, params,{
   one :{
       method: "GET",
     },
   all: {
        method: "GET",
        url: answersBaseUrl,
        isArray: true
    }


  });

      return res;
});

然后在你的控制器中:

//get answers by questionnaire
//GET /answers?questionnaireId=123
$scope.answersByQuestionnaire = answers.all({questionnaireId: 123});

 //get answers by question
 //GET /answers?questionId=123
 $scope.answersByQuestion = answers.all({questionId:123}); 

 //get single answer by questionnaire and question
 //GET /answers/123/123
 $scope.answer = answers.one({questionnaireId: 123,questionId:123 });

(检查网络日志,你可以看到预期的行为)