breezeJS自定义谓词

时间:2014-01-20 14:20:28

标签: breeze single-page-application

我想写一个稍微复杂的查询,所以我想知道是否有办法提供自定义函数作为where子句的谓词。

例如,如果我们可以做类似的事情会很好:

 var myArray = [1, 2, 3];

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

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

查看源代码我意识到最新版本的BreezeJS中没有这种功能(我可能错了)。

我只是想知道微风是否支持类似的东西。

1 个答案:

答案 0 :(得分: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);

    }

};

这个例子比你要求的要复杂得多,所以删除了你不想简化查询的部分。我在这里向您展示如何在查询中同时获得“和”和“或”。我还展示了如何检查本地metadataStore,以便在转到服务器之前查看该项是否存在。

如果该项目不存在而您想要创建它,请注意您的线程计时并将对象创建包装在承诺中,然后再执行导航到另一个页面以显示新项目。导航可能比创建功能更快,并且新项目可能尚未被敲除绑定到您的viewmodel中,因此它可能在新页面上显示为空白。这会让你疯狂一段时间。