2015-02-16 6 views
0

Я работаю в первый раз на стороннем приложении, которое было построено с помощью Knockout (с использованием v2.1.0).нокаут с наблюдаемым объектом json - не заполняется моя модель просмотра

Я не могу получить извлеченный объект json в мою модель просмотра, хотя данные извлекаются. Код, с которым я работаю, довольно большой (этот конкретный файл viewmodel, в котором я работаю, составляет около 1700 строк). Вот усеченная версия кода:

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

    //a ton of other self.observables... 

    //this is the part I'm trying to update with a new enhancedTiers (array of objects) 
    self.medical = { 
     //a bunch of other self.observables... 
     enhancedTiers: ko.observableArray([]) 
    }, 

    //more self.observables... 

    //down to the ajax success callback I'm working within 
    success: function(data, textStatus, jqXHR) { 
     ... 
     switch (self.currentService()) { 
      case "medical" : 
       with (self.medical) { 
        //we set the existing observable data here... 
        //trying to set the NEW data 
        enhancedTiers(data.enhancedTiers); 
        console.log('***************************'); 
        console.log(data.enhancedTiers); 
        console.log(data.enhancedTiers[0].name); 
        console.log(data.enhancedTiers[0].summaryBean.familyDedMet); 
        console.log('***************************'); 
        //all these log out the correct data 
       } 
     } 
     ... 
    } 

В моем HTML, я делаю следующее, чтобы посмотреть, смогу ли я получить некоторые данные для вывода:

<span data-bind="text: medical.enhancedTiers()[0].name"></span> 

Я получаю следующее сообщение об ошибке:

Uncaught Error: Unable to parse bindings. 
Message: TypeError: Cannot read property 'name' of undefined; 
Bindings value: text: medical.enhancedTiers()[0].name 

Если изменить HTML для этого:

<span data-bind="text: medical.enhancedTiers()[0]"></span> 

Пользовательский интерфейс отображает [объект объекта].

Я также попытался использовать плагин отображения, но не смог получить эту работу.

У меня, очевидно, есть данные от json-ответа, однако я не могу получить его в viewmodel. У кого-нибудь есть какие-либо советы о том, как вернуть мой возвращенный объект json массивов в мою модель просмотра?

Если я жестко кодирую расширенные словари json в моей модели просмотра, у меня нет проблем с привязкой пользовательского интерфейса к этим данным, я просто не могу получить свои данные в модели viewmodel.

ответ

0

Это потому, что представление визуализируется до того, как вы заполнили наблюдаемый массив, поэтому в то время эти поля не существуют. Вы должны были бы поставить в чек на ваше связывание, как:

<span data-bind="text: medical.enhancedTiers().length > 0 ? medical.enhancedTiers()[0].name : ''"></span> 
+0

Спасибо человеку, который, похоже, вопрос ... Кажется, немного грязный в HTML, но я могу обернуть логику в родительском 0 ->, чтобы он выглядел немного лучше. –