我尝试在查询中使用withParameters
方法:
query.withParameters({ includeLocation: true })
很遗憾,我的参数未添加到网址中。我使用breeze.debug.js,我在其中找到了这一行
//queryOptions = __extend(queryOptions, this.parameters);
这是一个错误吗?是否已取消withParameters
支持?或者我做错了什么?
我使用oData
答案 0 :(得分:2)
使用.withParameters
时,数据服务适配器将参数添加到URL,而不是Breeze核心。这就是为什么这条线被注释掉了。这允许对参数进行不同的编码,具体取决于所使用的后端。
这很好,但Breeze 1.4.8附带的OData数据服务适配器无法处理.withParameters
。 WebApi适配器可以,但不是OData适配器。我们将确保在将来的版本中添加它。在此期间,您可以继续使用您的解决方法。
这种疏忽/遗漏部分是因为我们不知道任何处理自定义参数的OData服务。如果我可能会问,您使用的OData服务是什么?
答案 1 :(得分:0)
看起来很快就会修复这个问题:https://github.com/Breeze/breeze.js/issues/19。
与此同时,您可以使用此代码作为解决方法(对此pull request作者的称赞):
var odataAdapter = breeze.config.getAdapterInstance('uriBuilder', 'OData');
var origBuildUri = odataAdapter.buildUri;
odataAdapter.buildUri = function (entityQuery, metadataStore) {
var uri = origBuildUri(entityQuery, metadataStore);
//Add custom query option support to webapi odata.
//See https://github.com/Breeze/breeze.js/issues/19
if (entityQuery.parameters !== null && typeof entityQuery.parameters === 'object'
&& Object.keys(entityQuery.parameters).length)
{
var queryParams = {};
for (var param in entityQuery.parameters) {
if (/^([^\$].*)$/.test(param)) {
var val = entityQuery.parameters[param];
if (typeof val == 'string') val = "'" + val + "'";
queryParams[param] = val;
}
}
//get the uri without the resourceName
var resourceName = entityQuery.resourceName;
uri = uri.substr(resourceName.length + 1);
//build the new uri
uri = resourceName + toQueryOptionsString(queryParams) + '&' + uri;
}
//Copied from breeze.js OData adapter
function toQueryOptionsString(queryOptions) {
var qoStrings = [];
for (var qoName in queryOptions) {
var qoValue = queryOptions[qoName];
if (qoValue !== undefined) {
if (qoValue instanceof Array) {
qoValue.forEach(function (qov) {
qoStrings.push(qoName + "=" + encodeURIComponent(qov));
});
} else {
qoStrings.push(qoName + "=" + encodeURIComponent(qoValue));
}
}
}
if (qoStrings.length > 0) {
return "?" + qoStrings.join("&");
} else {
return "";
}
}
return uri;
};