2014-01-06 64 views
0

我是新來的微風,我無法想象會發生什麼事情。這是一個兩部分問題:調用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); 
     } 

如果我還沒有提供了足夠的代碼,以幫助做出診斷,我會很樂意根據要求提供更多。

任何建議將不勝感激!

+0

還有一我遺漏的關鍵信息。對getUserHealthMetricFromId()的調用發生在一個名爲「setColor」的函數中,該函數從以下ko綁定語句中調用: data-bind =「style:{background:$ parent.setColor(userId(),healthMetricId ),value())}「 上面顯示的敲除catch:(ex.message =」無法處理綁定「」+ bindingKey +等..) ...因爲與這個有約束力的陳述直接相關而被拋出。然而,在我重構getUserHealthMetricFromId之前,這個綁定語句正在工作。 – Sean

+0

不知道發生了什麼事情,但我會找出問題以確定問題是否是淘汰,輕風或您的代碼。首先嚐試執行沒有任何敲除綁定代碼的查詢,看看你是否有任何問題。如果沒有,然後分段開始添加你的綁定邏輯。 –

+0

謝謝你的建議傑伊。我已經達到了杜蘭達爾的風格,並且更新版本。現在我得到這個消息:Predicate沒有被定義,參照Predicate()ctor。這鈴響了嗎? – Sean

回答

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; 
+0

謝謝,這個工作! – Sean

+1

您應該在文檔中確實有一些文檔記錄此快捷方式,以便您的文檔不依賴於計算器的完整性。 –

+0

這真的幫了我。 – Neil

相關問題