2013-04-28 63 views
0

簡單的要求 - 在我的視圖模型中需要填充在datacontext模塊中的淘汰賽觀察數組。 2個不同的模塊是問題的核心。傳遞淘汰賽observables作爲參數

基本問題是,如果knockout observable是一個函數,那麼如何將它作爲參數傳遞,以及這個變量的範圍是什麼。它是全球性的,因爲它是可觀察的嗎?我使用的模式直接從John Papa的SPA Jumpstart課程中解脫出來,但似乎並不適用於我,除非我在某處丟失了括號或返回語句。我嘗試了許多不同的組合。

使用JPs熱毛巾mvc模板,但不參考我的查詢。

這裏是視圖模型代碼

define(['dataContext'], function (datacontext) { 
    var summary = ko.observableArray(); 
    var initialise = false; 

    var prodModel= { 
     activate: activate, 
     title: 'Home View', 
     summary:summary 
    }; 

    return prodModel; 



    //#region Internal Methods 
    function activate() { 
     if (!initialise) 
     { 

      initialise = true; 
      return getSummary(); 


     } 

     return; 

    } 
    function getSummary() { 

    // Go to the context and populate the observable array 
    return datacontext.getProductionSummary(summary); 

    }; 
    //#endregion 
}); 

以下是DataContext的模塊。嘗試在getProductionSummary方法中將javascript數組分配給knockout observable數組時發生該錯誤。

值得一提的是,我也試圖使用pushAll實用程序功能。

填充observable數組的唯一東西是直接將其推入,但即使我這樣做,我沒有在調用viewmodel代碼中的值,因爲我期望與普通變量。

define(['config','services/logger'], 
function (config,logger) { 


    var getProductionSummary = function (summaryObservableArray) { 

    //Call Web API 
     var query = breeze.EntityQuery.from('getSummary'); 
     return manager.executeQuery(query).then(querySucceeded).fail(queryFailed); 

    //Yay got the data.. lets play 
     function querySucceeded(data) { 
      var summary = []; 
      for (var i = 0; i < data.results.length; i++) { 
       summary.push(data.results[i]); 
      } 


      return summaryObservableArray(summary); 

     } 


    }; 

    var datacontext = { getProductionSummary: getProductionSummary }; 
    return datacontext; 



    // #region Internal functions 

    var manager = createBreezeManager(); 
    function createBreezeManager() { 


     var mgr= new breeze.EntityManager(config.dataEndPoints); 

     return mgr; 
    }; 

    function queryFailed(error) { 

     logger.log(error.message, null, 'dataContext', true); 
    } 
//#endregion 





}); 

這是在其中引發錯誤的看法位

<!--ko foreach:summary--> 
        <tr> 

         <td><span data-bind="text: summary().Count"></span></td> 
         <td><span data-bind="text: summary().Percentage"></span></td> 
        </tr> 
        <!--/ko--> 

的錯誤是

Unable to parse bindings.↵Message: ReferenceError: summary is not defined;↵Bindings value: text: summary().Count 
+1

KO可觀察變量(或屬性)的範圍與* any *變量(或屬性)的範圍相同。另外,不要忘記解釋「錯誤」是什麼。 – user2246674 2013-04-28 08:29:33

+0

是的,什麼是錯誤?但是我也會說,返回'summaryObservableArray(summary)'是沒有意義的。這是因爲一個可觀察的簡單的''返回這個';'當寫入時,在這種情況下將是'window'對象。 – 2013-04-28 10:32:29

+0

這行'var manager = createBreezeManager();'沒有執行,'manager.executeQuery(query)'應該拋出錯誤。 – xdenser 2013-04-28 11:34:12

回答

0

@xdenser已經正確識別代碼中的最顯著的問題。

 
return datacontext; 
... 
// never executed because you returned; manager is undefined. 
var manager = createBreezeManager(); 

您沒有聲明錯誤。我們的賭注是,當您在您的視圖模型中撥打getProductionSummary時,您會遇到「經理未定義」錯誤。將排隊向上移動(最好靠近datacontext的頂部),你會很好:

 
var manager = createBreezeManager(); 
... 
return datacontext; 

這一切似乎都有點折磨。爲什麼不去掉createBreezeManager並開始如下?

 
var manager = new breeze.EntityManager(config.dataEndPoints); 

你也有一個有點過於複雜querySucceeded這可能是如此簡單:

 
function querySucceeded(data) { summaryObservableArray(data.results); } 
+0

感謝沃德的迴應。微風代碼執行得很好。返回值並且datacontext中的KO數組被填充,但視圖上的綁定失敗,並且沒有定義錯誤摘要。我在先前的註釋中添加了完整的錯誤。 我在成功函數中填充數組的唯一原因是我認爲將data.results直接添加到observable中會更昂貴,因爲每個項目都會發出通知。我錯了嗎 ? – shai 2013-04-29 02:33:43

+0

注意將項目推入可觀察數組的危險是正確的。幸運的是,'data.results' **已經是一個數組**了。通過直接使用它,你可以做同樣的事情,當你構建'summary'並注入它時。 – Ward 2013-04-29 07:13:49

0

數據綁定=「TEXT:摘要()==算錯 數據綁定=「text:Count == RIGHT

Duh ..被錯誤語句拋出。但感謝所有人的迴應。

0
<!--ko foreach:summary--> 
     <tr> 
      <td><span data-bind="text: Count"></span></td> 
      <td><span data-bind="text: Percentage"></span></td> 
     </tr> 
<!--/ko--> 

這是正確的視圖

內部foreach結合上下文是數組項。 仍然不明白你的dataContext模塊是如何工作的。懷疑你顯示的不是實際的代碼。