我是新手,我无法想象是什么导致了这种情况发生。这是一个两部分问题:
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);
}
如果我没有提供足够的代码来帮助做出诊断,我很乐意根据您的要求提供更多代码。
任何建议都会非常感谢!
答案 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;