This is my first time using the Knockout Mapping plugin to create my viewmodel directly from JSON from the server. The initial set of data comes from the server, then I poll for changes ever 10 seconds. This code works, but I feel like it is not very DRY.

I've looked all over for better examples but haven't had any luck. How can I avoid calling getJSON in two different places?

In my customer-scripts.js file:

function CustomerRefresher(id) {
    var viewModel;

    $.getJSON('/ApiCustomer/Get/' + id, function (data) {
        viewModel = ko.mapping.fromJS(data);
        ko.applyBindings(viewModel);
        setTimeout(refresh, 10000);
    });

    var refresh = function () {
        $.getJSON('/ApiCustomer/Get/' + id, function (data) {
            ko.mapping.fromJS(data, {}, viewModel);
        });

        setTimeout(refresh, 10000);
    }
}

In my .cshtml file:

$(function () {
    CustomerRefresher(@Model.Id);
});
有帮助吗?

解决方案

function CustomerRefresher(id){
  var refresh = function(){
    $.getJSON('/ApiCustomer/Get/' + encodeURIComponent(id), function(data){
      if (typeof CustomerRefresher.viewModel !== 'undefined'){
        ko.mapping.fromJS(data, {}, CustomerRefresher.viewModel);
      }else{
        CustomerRefresher.viewModel = ko.mapping.fromJS(data);
        ko.applyBindings(CustomerRefresher.viewModel);
      }
      setTimeout(refresh, 10000);
    });
  };
  refresh();
}

Something like that? (can use the function itself to "cache" the view model) Also, example provided.

Also, FWIW, this is probably better suited for codereview.SE.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top