我是新來的微風,我無法想象會發生什麼事情。這是一個兩部分問題:調用Predicate()構造函數會導致Knockout拋出無法解釋的異常。
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)的第一個謂詞報關行,調用構造函數謂詞使執行跳轉到下面終於在淘汰賽3.0.0.debug條款.js文件(行1483):
finally {
ko.dependencyDetection.end();
_isBeingEvaluated = false;
}
當我執行 「_isBeingEvaluated =假」 的語句, 異常莫名其妙地丟在這裏登陸我(行2607):
} catch (ex) {
ex.message = "Unable to process binding \"" + bindingKey + ": " + bindings[bindingKey] + "\"\nMessage: " + ex.message;
throw ex;
}
想這可能有更多的事情要做淘汰賽比微風,我測試通過硬編碼改變代碼編號的,這樣的參數變量(這是觀測)不參與調用構造函數了:
var p1 = new Predicate('userId', '==', 1);
var p2 = new Predicate('healthMetricId', '==', 4);
沒有骰子。同樣的事情發生。當我嘗試進入Predicate()時,會發生同樣的事情。我只是把我拋到了淘汰賽調試文件。
2)在同一個函數中,我傳入的變量在調試窗口中顯示爲dependentObservables()。這些值是另一個微風對服務器的調用的產物。爲什麼微風將它們渲染爲dependentObservables而不是簡單的observables(我沒有在代碼中的任何地方聲明任何計算)?這裏是我的代碼的快速概述:
在視圖模型:
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);
}
如果我還沒有提供了足夠的代碼,以幫助做出診斷,我會很樂意根據要求提供更多。
任何建議將不勝感激!
還有一我遺漏的關鍵信息。對getUserHealthMetricFromId()的調用發生在一個名爲「setColor」的函數中,該函數從以下ko綁定語句中調用: data-bind =「style:{background:$ parent.setColor(userId(),healthMetricId ),value())}「 上面顯示的敲除catch:(ex.message =」無法處理綁定「」+ bindingKey +等..) ...因爲與這個有約束力的陳述直接相關而被拋出。然而,在我重構getUserHealthMetricFromId之前,這個綁定語句正在工作。 – Sean
不知道發生了什麼事情,但我會找出問題以確定問題是否是淘汰,輕風或您的代碼。首先嚐試執行沒有任何敲除綁定代碼的查詢,看看你是否有任何問題。如果沒有,然後分段開始添加你的綁定邏輯。 –
謝謝你的建議傑伊。我已經達到了杜蘭達爾的風格,並且更新版本。現在我得到這個消息:Predicate沒有被定義,參照Predicate()ctor。這鈴響了嗎? – Sean