2014-02-18 70 views
4

我試圖用在查詢withParameters方式類似:Breeze實體查詢中是否仍支持參數?

query.withParameters({ includeLocation: true }) 

不幸的是我的參數沒有被添加到URL。我使用breeze.debug.js,我發現這條線

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

這是一個錯誤?支持取出withParameters?或者我做錯了什麼?

我使用的OData

+1

的'.withParameters'方法返回與參數一個新的查詢增加。所以請確保你分配的結果: 'query = query.withParameters({includeLocation:true});' –

+0

@SteveSchmitt - 是的,我正在那樣做。其實我鏈接了查詢時使用的所有選項。 –

+0

@PWKad我使用最新的[1.4.8] –

回答

2

當使用.withParameters,參數由數據服務適配器添加到URL,而不是由微風核心。這就是爲什麼該行被註釋掉的原因。這允許參數編碼方式不同,具體取決於所使用的後端。

這很好,但Breeze 1.4.8附帶的OData數據服務適配器不能處理.withParameters。 WebApi適配器,但不是OData適配器。我們將確保它在未來的版本中添加。同時,您可以繼續使用您的解決方法。

這種忽略/遺漏部分是因爲我們不知道處理自定義參數的任何OData服務。如果我可能會問,您使用的是什麼OData服務?

+0

我使用WCF數據服務和自定義元數據提供程序。所以我能夠爲查詢添加自定義參數。 –

+0

您應該將這些信息添加到api文檔中,我長時間搜索這種行爲,例如「但文檔說這是正確的行爲」,然後您讀取它是通過數據服務適配器添加的: - /和odata不支持它。 – Sebastian

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