2014-01-20 58 views
1

我想寫一個稍微複雜的查詢,所以我不知道是否有提供自定義功能的where子句的謂詞的方式。breezeJS定製謂詞

例如,這將是很好,如果我們可以這樣做:

var myArray = [1, 2, 3]; 

var filter = function (person) { 
    return elementExists(person.id, myArray); 
}; 

EntityQuery.from('persons').toType('Person') 
     .where(filter); 

查看源代碼,我意識到,這種能力是不存在BreezeJS的最新版本(我可能是錯的) 。

我只是想知道清風支持類似的事情。

回答

1

在你應該能夠找出是否通過檢查返回的長度存在該元素的客戶端。

var getItems = function (runId, tankId, topicId) { 
    var localquery = EntityQuery.from("Items") 
     .using(manager); 

    var p1 = new breeze.Predicate("runId", "eq", runId); 
    var p2 = breeze.Predicate("tankId", "eq", window.app.vm.tanks.activetank()); 
    var p3 = breeze.Predicate("topicId", "eq", topicId); 
    var p4 = breeze.Predicate("topicId", "eq", app.Topics.Growth_Topic); 

    var pred; 
    var runId = p1._value; 
    var tankId = p2._value; 
    // If the third parameter exists, add it to your complex predicate 
    // adding a specific Topic to the predicate 
    // Otherwise only add the General topic 
    if (p4) 
     pred = breeze.Predicate.or([p3, p4]); 
    else 
     pred = breeze.Predicate.or(p3); 

    var newpred = breeze.Predicate.and([p1, p2, pred]); 
    // newpred is now querying for a specific runId and tankId and (p3 or p4) if p4 exists 
    // otherwise it is querying for runId and tankId or (p3) 

    // So look in the local metadataStore first 
    var queryb = localquery.where(newpred); 
    var results = manager.executeQueryLocally(queryb); 

    // If we do have it locally use it 
    if (results.length) { 
     window.app.vm.Items.Items(results); 
    } 
    // otherwise get it from the database 
    else { 
     var query = EntityQuery 
      .from("Items") 
      .where(newpred); 

     // return the promise from breeze 
     return manager.executeQuery(query) 
      .then(function (data) { 
       // check to see if the call to the webapi controller returned any data 
       if (data.length > 0) {      
        // stick it into the viewmodel it to your viewmodel     
        window.app.vm.Items.Items(data.results); 
        return "element exists"; 
       } else { 
        return "element does not exist";       
       } 
      }) 
      .fail(queryFailed); 

    } 

}; 

這個例子比你要求的要複雜得多,因此刪掉了你不想簡化查詢的部分。我在此向您展示如何在您的查詢中同時添加「and」和「or」。我還展示瞭如何檢查本地元數據存儲,以確定在去服務器之前該項是否存在。

如果該項目不存在,要創建它,小心你的線程時間和包裹對象創建的一個承諾,你這樣做導航到另一個頁面,以顯示新的項目之前。導航可能比創建功能更快,新項目可能還沒有被擊倒被綁定到你的視圖模型,所以它可能會顯示空白的新頁面上。這會讓你瘋狂很長一段時間。