2013-12-10 13 views
11

Uygulamamda, sunucudan yeni güncelleme almak için periyodik olarak her 5 saniyede bir ajax araması yapıyor. [ { "foo": "VALX", "bar": "valy"ajax isteği periyodik olarak otomatik olarak yenilendiğinde knockout.js veri bağlama nasıl kullanılır?

}, { "foo"

sunucudan Benim ajax verilerle

benziyor JSON dizidir: "valw", "bar": "Valz" } ]

Benim ajax kodudur:

(function update() { 

    $.ajax({ 
     type : 'GET', 
     url : url, 
     data : { 

     }, 
     dataType : "json", 
     global : false, 
     success : function(content, textStatus, jqXHR) { 
     myViewModel = content; 
     ko.applyBindings(myViewModel); 

     }, 
     complete: function() { 

     setTimeout(update, 5000); 
      }, 

     error: function(xhr, textStatus) { 

      } 
    }); 
    })();      

Benim HTML:

<tbody data-bind="foreach: myViewModel"> 
         <tr> 
          <td data-bind="text: foo"></td> 
          <td data-bind="text: bar"></td> 
         </tr> 
        </tbody> 

Ama bu işe yaramazsa ve ben ilk ajax çağrısından sonra hata alıyorum: Aynı elemana bağlamaları birden çok kez uygulayamazsınız.

cevap

30

Kapa çeneni. Sadece bir kez applyBindings'u arayın. Bunun yerine yapmanız gereken, görünüm modelinize bir observable özelliğinin ayarlanmasıdır. (Örneğin sizin ajax çağrısında) yeni veriye sahip Sonra

function ViewModel() { 
    var self = this; 

    self.data = ko.observableArray(); 
}; 

var viewModel = new ViewModel(); 

ko.applyBindings(viewModel); 

:

$.ajax({ 
    success : function(content, textStatus, jqXHR) { 
     viewModel.data(content); 
    } 
}); 

Not: Veri a ayarlayabilirsiniz İşte

nasıl kurulum görünümü modeli olur ise birkaç farklı yol. Zamanlanmış etkinliğinizin görünüm modeli dışında olmasını istiyorsanız, özellik modeline erişmek ve bunları güncellemek için görünüm modeli örneğini (örneğimde, viewModel) kullanabilirsiniz. Zamanlanmış etkinliği görünümünüzün modeline yerleştirebilir ve daha sonra sadece self.data(content) (ya da benzer bir şey) arayın.

İlgili konular