调用Predicate()构造函数会导致Knockout抛出无法解释的异常。

时间:2014-01-06 03:49:03

标签: breeze

我是新手,我无法想象是什么导致了这种情况发生。这是一个两部分问题:

1)我的功能非常简单。我正在查询两个谓词:

var getUserHealthMetricFromId = function (userId, healthMetricId, forceRemote) {

            var p1 = new Predicate('userId', '==', userId);
            var p2 = new Predicate('healthMetricId', '==', healthMetricId);
            var query = EntityQuery.from('UserHealthMetrics').select('lowerValue', 'upperValue')
                .where(p1.and(p2));

            if (!forceRemote) {
                //results = getUserHealthMetricFromLocal(userId, healthMetricId);
                var query = query.using(breeze.FetchStrategy.FromLocalCache);
            }
            var promise = manager.executeQuery(query);
            return promise;
        };

当我调试(Chrome)第一个谓词声明行时,调用Predicate ctor导致执行跳转到Knockout-3.0.0.debug.js中的以下finally子句(第1483行):

finally {
            ko.dependencyDetection.end();
            _isBeingEvaluated = false;
        }

当我执行“_isBeingEvaluated = false”语句时, 一个例外被莫名其妙地抛到了我这里(第2607行):

        } catch (ex) {
            ex.message = "Unable to process binding \"" + bindingKey + ": " + bindings[bindingKey] + "\"\nMessage: " + ex.message;
            throw ex;
        }

认为这可能与Knockout有关,而不是与Breeze有关,我通过硬编码Id来改变代码进行测试,以便参数变量(可观察的)不再涉及调用ctor:

var p1 = new Predicate('userId', '==', 1);
var p2 = new Predicate('healthMetricId', '==', 4);

没有骰子。同样的事情发生了。当我尝试进入Predicate()时,同样的事情发生了。我只是把我扔到淘汰赛调试文件中。

2)在同一个函数中,我传入的变量在调试窗口中显示为dependentObservables()。这些值是另一个微风调用服务器的产物。为什么breeze会将这些渲染为dependentObservable而不是普通的observable(我没有在代码中的任何地方声明任何计算)?以下是我的代码的快速概述:

在视图模型中:

var latestEntriesObservable = ko.observableArray(null);

 function activate() {
            $('#rangeDialog').hide();

            var promise = Q.all([datacontext.getLatestEntries(latestEntriesObservable,  currentUserId, false),
            datacontext.getUserHealthMetrics(userHealthMetricsObservable, currentUserId, false),
            datacontext.getUserHealthMetricNames(userHealthMetricNamesObservable, currentUserId, false)]);
            return promise;
        }

var getLatestEntries = function (latestEntriesObservable, userId, forceRemote) {
            var lastEntryQuery = EntityQuery.from('LatestEntries').withParameters({ id: 1 });

            if (!forceRemote) {
                var e = getLocal('HealthMetricValues', 'healthMetricId');
                if (e.length > 0) {
                    latestEntriesObservable(e);
                    return Q.resolve();
                }
            }

            return manager.executeQuery(lastEntryQuery)
                .then(querySucceeded)
                .fail(queryFailed);


            // handle the ajax callback
            function querySucceeded(data) {
                if (latestEntriesObservable) {
                    latestEntriesObservable(data.results);
                    //latestEntriesObservable(model.toProtectedObservableItemArray(data.results));
                }
                log('Retrieved latest entries.', data, true);

            }
        };

function getLocal(resource, orderBy) {
            var query = EntityQuery.from(resource).orderBy(orderBy).withParameters({ id: 1 });
            return manager.executeQueryLocally(query);
        }

如果我没有提供足够的代码来帮助做出诊断,我很乐意根据您的要求提供更多代码。

任何建议都会非常感谢!

1 个答案:

答案 0 :(得分:2)

好的,我认为问题是该类实际上是 breeze.Predicate 。为了节省输入,我们经常分配这样的局部变量。

var Predicate = breeze.Predicate;
var p1 = new Predicate('userId', '==', 1);

或者您可以通过

明确地执行此操作
var p1 = new breeze.Predicate('userId', '==', 1);

var p1 = breeze.Predicate.create('userId', '==', 1);

据推测,你正在使用EntityQuery做同样的事情,即

var EntityQuery = breeze.EntityQuery;