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

Breeze 调用Predicate()构造函数会导致Knockout抛出无法解释的异常。,breeze,Breeze,我是新来的微风,我无法想象是什么导致了这一切的发生。这是一个由两部分组成的问题: 1) 我的功能很简单。我使用两个谓词进行查询: var getUserHealthMetricFromId = function (userId, healthMetricId, forceRemote) { var p1 = new Predicate('userId', '==', userId); var p2 = new Predicate('healthM

我是新来的微风,我无法想象是什么导致了这一切的发生。这是一个由两部分组成的问题:

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)第一个谓词声明行时,调用谓词构造函数会导致执行跳转到Knockout-3.0.0.debug.js(第1483行)中的finally子句:

当我执行“\u isBeingEvaluated=false”语句时, 我在这里(第2607行)时莫名其妙地抛出了一个异常:

考虑到这可能更多地与Knockout有关,而不是与Breeze有关,我通过对Id进行硬编码来改变代码,从而使参数变量(可观察的)不再参与调用ctor:

var p1 = new Predicate('userId', '==', 1);
var p2 = new Predicate('healthMetricId', '==', 4);
没有骰子。同样的事情也会发生。当我尝试进入Predicate()时,同样的事情也会发生。我只是把我扔到淘汰调试文件

2) 在同一个函数中,我传入的变量在调试窗口中显示为dependentObservables()。这些值是对服务器的另一个breeze调用的产物。为什么breeze会将它们呈现为DependentToServable而不是普通的Observable(我没有在代码中的任何地方声明任何Computed)?下面是我的代码的简要概述:

在视图模型中:

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);
        }
如果我没有提供足够的代码来帮助诊断,我很乐意根据请求提供更多代码


任何建议都将不胜感激

好的,我认为问题在于类实际上是breeze.Predicate。为了节省打字时间,我们经常这样分配一个局部变量

var Predicate = breeze.Predicate;
var p1 = new Predicate('userId', '==', 1);
或者您可以通过

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

大概,您正在对EntityQuery执行相同的操作,即

var EntityQuery = breeze.EntityQuery;

还有一条我遗漏的关键信息。对getUserHealthMetricFromId()的调用。。发生在一个名为“setColor”的函数中,该函数是从以下ko binding语句调用的:data bind=“style:{background:$parent.setColor(userId(),healthMetricId(),value())}”和上面显示的敲除捕获:(ex.message=“无法处理绑定\”“+bindingKey+等)…被抛出,因为它与此绑定语句直接相关。但是,在我进行重构以调用getUserHealthMetricFromId之前,此绑定语句正在工作。不确定发生了什么,但我将隔离问题,以确定问题是knockout、breeze还是您的代码。首先尝试在没有任何提示的情况下执行查询锁定绑定代码并查看是否有任何问题。如果没有,则逐段开始重新添加绑定逻辑。感谢Jay的建议。我已将durandal和breeze升级到新版本。现在我收到一条消息:谓词未定义,参考谓词()ctor.这听起来有点奇怪吗?当我删除ko绑定代码时,我得到了以下异常:未捕获引用错误:谓词未定义…因此它显然与Breeze相关您的文档中应该有一些东西记录此快捷方式,以便您的文档不依赖stackoverflow来完成。这真的帮助了我。
var p1 = new breeze.Predicate('userId', '==', 1);
var p1 = breeze.Predicate.create('userId', '==', 1);
var EntityQuery = breeze.EntityQuery;