2016-06-03 2 views
-1

У меня есть HTML-код, как показано ниже. Я привязываю данные к ярлыкам.Как связать сложные данные с пользовательским интерфейсом в KnockoutJS?

data-bind="text: employeeData.Id, valueUpdate:'keyup'" 

data-bind="text: employeeData.Name, valueUpdate:'keyup'" 

И мой нокаут сценарий, как показано ниже:

self.employeeData = { Id: ko.observable(" "),Name:ko.observable(" ") }; 

self.getEmployee = function(data, event){ 
    $.ajax({ 
    type: "Get", 
    url: 'http://localhost:8081/api/Values/GetEmployee', 
    dataType: "json", 
    cache: false, 
    async: false, 
    crossDomain:true, 
    dataType : 'json', 
    success: function (data) { 
     self.employeeData = ko.observable(data); 
    }, 
    error: function() { 
     alert("Error"); 
    } 
}); 

Я получаю данные из Ajax вызова правильно, но он не становится связан с пользовательским интерфейсом. Может ли кто-нибудь помочь мне, что я делаю неправильно здесь?

+1

Адрес: ko.applyBindings? –

+0

@BonMacalindong: его там внизу файла. Другое связывание происходит нормально, например, при нажатии какой-либо кнопки я могу изменить текст метки, который имеет тип строки. В приведенном выше примере я имею дело со сложным объектом, и именно там у меня возникают проблемы – yashwanth

+0

Почему вы делаете 'self.employeeData = ko.observable (data);'? Разве это не переписывает вашу модель? Shuldn't вы делаете 'self.employeeData.Id (data.Id)'? Вы читали документы? http://knockoutjs.com/documentation/observables.html – Cristy

ответ

1

Ваше employeeData свойство не наблюдаемого, поэтому, когда обработчик Ajax success работает (вероятно, после того, как applyBindings был запущен) свойство будет переписано со ссылкой на наблюдаемый.

Сделайте что-нибудь, как это вместо:

function getEmployee(data) { 
    data = data || {}; 
    return { 
    Id: ko.observable(data.Id || " "), 
    Name: ko.observable(data.Name || " ") 
    }; 
} 

self.employeeData = ko.observable(getEmployee()); 

self.getEmployee = function(data, event){ 
    $.ajax({ 
    type: "Get", 
    url: 'http://localhost:8081/api/Values/GetEmployee', 
    success: function (data) { 
     // option 1: 
     self.employeeData(getEmployee(data)); 

     // option 2: 
     self.employeeData().Id(data.Id); 
     self.employeeData().Name(data.Name); 

     // option 3: 
     // use ko.mapping library and its update functionality 

     // option 4: 
     // use constructor functions and give them a "loadData" method, for ex. 
    } 
    } 
}); 

Я рекомендую смотреть в «конструктор функций» для просмотра моделей, а также ko.mapping плагин.

+1

Разве это неэффективно для повторной сборки всего объекта вместо использования функций обновления нокаутов? ('model.attributeName (newValue)', например: 'employeeData.Id (27)'? – Cristy

+0

Да, очень хорошая точка, но я предположил, что эти два свойства могут быть только те, что указаны в примере OP. немного ответьте на оба пути. – Jeroen

Смежные вопросы