2013-07-03 29 views
4

我正在使用MVC 4.0與knockout.js創建一個頁面,每5-10秒鐘會調用一次數據庫,並更新從數據庫中檢索新對象的模型,然後使用新模型更新視圖。使用knockout.js我需要從服務器調用更新我的模型,然後在視圖上顯示

目前我正在進行初始JSON獲取調用,這是返回模型,然後我可以將它綁定到視圖。然後我再次設置getJSON調用來每10秒執行一次更新,它將執行該函數並取回數據,但屏幕上未顯示更新。我曾嘗試在每次調用後調用ko.applyBindings,但頁面上仍然沒有更新,然後在幾次調用後崩潰瀏覽器。

我不確定我究竟做錯了什麼。我已經包含了下面代碼的相關部分。

的JavaScript:

<script type="text/javascript"> 
var viewModel; 

var update = setInterval(function() { 
    $.getJSON(
       "/Home/Get", {}, 
       function (model) { 
        viewModel = model; 
        bindViewModel(viewModel); 
       }); 
}, 10000); 

$(document).ready(
    function() { 
     $.getJSON(
      "/Home/Get", {}, 
      function (model) { 
       viewModel = model; 
       bindViewModel(viewModel); 
      }); 
    }); 


function bindViewModel(viewModel) { 
    ko.applyBindings(viewModel); 
} 
</script> 

表中顯示型號

<div data-bind="foreach: { data: Events, as: 'evnts' }"> 
<span data-bind="text: evnts.LastUpdate"></span> 
<table id="EventsTable" style="display:inline; float:left;"> 
    <tbody> 
     <tr id="EvntsHeader" data-bind="visible: evnts.IsVisible"> 
     <td> 
      <span data-bind="text: evnts.Name"></span> 
     </td> 
     <tr> 
      <td> 
       <table id="MarketsTable"> 
        <tbody data-bind="foreach: { data: evnts.Markets, as: 'markets' }"> 
         <tr> 
          <td id="MarketHeader"> 
           <span data-bind="text: markets.Name"></span> 
           <span data-bind="text: markets.NumberOfRunners"></span> 
          </td> 
         </tr> 
         <tr> 
          <td> 
           <table id="SelectionTable"> 
            <tbody data-bind="foreach: { data: markets.Selections, as: 'selections' }"> 
             <tr id="Selections"> 
              <td><span data-bind="text: selections.Number, visible: selections.IsVisible"></span></td> 
              <td><span data-bind="text: selections.Name, visible: selections.IsVisible"></span></td> 
              <td><span data-bind="text: selections.CurrentPrice, visible: selections.IsVisible"></span></td> 
              <td><span data-bind="text: selections.OpeningPrice, visible: selections.IsVisible"></span></td> 
             </tr> 
            </tbody> 
           </table> 
          </td> 
         </tr> 
        </tbody> 
       </table> 
      </td> 
     </tr> 
    </tbody> 
</table> 

Controlller - JSON獲取

[AcceptVerbs(HttpVerbs.Get)] 
    public JsonResult Get() 
    { 
     var model = new TestModel {LastUpdate = DateTime.Now}; 

     if (TestConstants.Update == false) 
     { 
      GetModelFirstTime(model); 
      TestConstants.Update = true; 
     } 
     else 
     { 
      UpdateModel(model, DateTime.Now); 
     } 

     return Json(model, JsonRequestBehavior.AllowGet); 
    } 

回答

1

理想情況下,你想只有一次申請綁定,並且是我們在頁面加載時完成。而不是在更新調用bindViewModel,請嘗試使用:

ko.mapping.updateFromJS(viewModel, model); 

如果你想讀了一點更多的映射 - http://knockoutjs.com/documentation/plugins-mapping.html

讓我知道,如果它工作或不...

+0

嘗試這和我仍然遇到同樣的問題。 –

相關問題