2015-10-05 2 views
1

У меня есть модель представления в нокауте, как следует. То, что я намерен достичь здесь, - сделать вызов ajax в функцию многократного использования следующим образом (и включить его в отдельный файл js).вызов функции ajax из значения нокаута undefined

Однако я получил сообщение об ошибке, показывающее self.CountryList не определен. Как это можно решить?

// Working 
var ViewModel = function() { 
    var self = this; 
    self.CountryList = ko.observableArray([]); 

    self.LoadCountry = function() { 
    $.ajax({ 
     url: '/api/MyApi', 
     type: 'GET', 
     dataType: 'json', 
     success(data): { 
      $.each(data, function (index, value) { 
       self.CountryList.push(value); 
      }); 
     } 
    }); 
    } 
} 

ko.applyBindings(new LoadCountry()); 

// Not working 
function LoadCountryList() { 
    $.ajax({ 
     url: '/api/MyApi', 
     type: 'GET', 
     dataType: 'json', 
     success(data): { 
      $.each(data, function (index, value) { 
       self.CountryList.push(value); 
      }); 
     } 
    }); 
} 

var ViewModel = function() { 
    var self = this; 

    self.CountryList = ko.observableArray([]); 

    self.LoadCountry = function() { 
    LoadCountryList(); 
    } 
} 

ko.applyBindings(new LoadCountry()); 

ответ

0

хорошо ясно self.ContryList не существует во внешнем файле. Один простой способ решить эту проблему, чтобы передать ссылку на соответствующий «список», чтобы толкнуть значения в:

function LoadCountryList(countryList) { 
    $.ajax({ 
     url: '/api/MyApi', 
     type: 'GET', 
     dataType: 'json', 
     success(data): { 
      $.each(data, function (index, value) { 
       countryList.push(value); 
      }); 
     } 
    }); 
} 

и в модели вида:

var ViewModel = function() { 
    var self = this; 

    self.CountryList = ko.observableArray([]); 

    self.LoadCountry = function() { 
    LoadCountryList(self.CountryList); 
    } 
} 
1

Ваш LoadCountryList функции во второй версии не имеет понятия объекта он должен работать на - т.е. он не имеет ни малейшего представления, что self является, следовательно, ошибка. Самое простое решение для вас, чтобы передать объект в при вызове функции:

function LoadCountryList(vm) { 
    $.ajax({ 
     url: '/api/MyApi', 
     type: 'GET', 
     dataType: 'json', 
     success(data): { 
      $.each(data, function (index, value) { 
       //reference the parameter passed to the function 
       vm.CountryList.push(value); 
      }); 
     } 
    }); 
} 

var ViewModel = function() { 
    var self = this; 

    self.CountryList = ko.observableArray([]); 

    self.LoadCountry = function() { 
    //pass ourselves to the function 
    LoadCountryList(self); 
    } 
} 
Смежные вопросы