Breeze实体查询中是否仍然支持withParameters?

时间:2014-02-18 12:30:04

标签: javascript angularjs breeze

我尝试在查询中使用withParameters方法:

query.withParameters({ includeLocation: true })

很遗憾,我的参数未添加到网址中。我使用breeze.debug.js,我在其中找到了这一行

//queryOptions = __extend(queryOptions, this.parameters);

这是一个错误吗?是否已取消withParameters支持?或者我做错了什么?

我使用oData

2 个答案:

答案 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;
};