4

Я работаю с нокаутом и столкнулся с проблемой. Я не знаю, как исправить. Я извлекаю объект json из контроллера mpc asp.net. Я передаю его к следующей функции:Невозможно разобрать привязки Ошибка нокаута

load = function (data) { 
     var myViewModel = function() { 
      var self = this; 

      ko.mapping.fromJS(data, self); 

      self.hasItems = ko.computed(function() { 
       return self.NumberOfItems > 0; 
      }, self); 

     }; 
     ko.applyBindings(myViewModel, window.document.getElementById("my-container")); 
    } 

Я добавляю пользовательское поведение в мою модели объекта на основе того, что возвращается в JSON, в частности NumberOfItems свойства JSON. Моя разметка:

<div class="content" style="display: none;" data-bind="visible: hasItems === false"> 
    <span class="empty">My Items</span> 
</div> 

Но я получаю эту ошибку:

Ошибка: Невозможно разобрать привязок. Сообщение: ReferenceError: hasItems не определен; Значение привязки: visible: hasItems === false

Я понятия не имею, почему - я новичок в этом, поэтому очень ценю любую помощь?

ответ

2

applyBindings ожидает объект. Попробуйте

ko.applyBindings(new myViewModel(), window.document.getElementById("my-container")); 

Кроме того, если вы хотите получить значение наблюдаемого, вам нужно будет использовать круглые скобки.

return self.NumberOfItems() > 0; 

http://jsfiddle.net/36xtR/

0

обособленно ckal ответа вы, вероятно, также хотите использовать ko.mappings таким образом:

ko.mapping.fromJS(data, {}, self); 
+0

Спасибо - в чем разница? – amateur

+0

Второй параметр - это настраиваемое сопоставление, если вы хотите указать цель обновления, вам нужно передать его в качестве третьего параметра - пожалуйста, посмотрите здесь: http://knockoutjs.com/documentation/plugins-mapping.html в разделе " Задание цели обновления « –

0

Ошибка вы видите «не в состоянии разобрать привязок» означает, что нокаут может Не находите то, что вы пытаетесь связать (hasItems).

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

Я хотел бы попробовать свои настройки ViewModel больше, как это:

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

     self.load = function (data) { 
      ko.mapping.fromJS(data, self); 
     } 

     self.hasItems = ko.computed(function() { 
      return self.NumberOfItems > 0; 
     }, self); 

    }; 
ko.applyBindings(new myViewModel(), window.document.getElementById("my-container")); 

Вы можете затем вызвать функцию загрузки в ViewModel в месте, где вы вызываете текущую функцию нагрузки.

+0

Должен ли я создать новый экземпляр myViewModel при переходе на applyBindings, например. новый myViewModel()? – amateur

+0

Да, пожалуйста, проверьте ckal ответ. –

+0

Да, похоже, что вы делаете, я обновлю свой ответ. –

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