0

У меня есть простой viewModel, который я создаю из MVC для строки json, я использую ko.mapping, чтобы выполнить это.Невозможно связать массив ko.observable с циклом foreach

var initialTicketData = {"Ticket": [{"ID":1,"EventID":506596,"Name":"General Admission","Quantity":100,"Price":15.0},{"ID":2,"EventID":506596,"Name":"Backstage Passes","Quantity":25,"Price":50.0}]}; 

var ticketViewModel = ko.mapping.fromJS(initialTicketData); 

ko.applyBindings(ticketViewModel); 

Я хочу перебрать этот массив и отобразить данные на странице. Я пытаюсь использовать привязку данных foreach.

<tbody data-bind="foreach: ticketViewModel.Ticket"> 
    <tr> 
     <td data-bind="text: ticketViewModel.Name"></td> 
     <td data-bind="text: ticketViewModel.Price"></td> 
     <td data-bind="text: ticketViewModel.Quantity"></td> 
    </tr> 
</tbody> 

Однако, когда я пытаюсь запустить, я получаю следующую ошибку.

"Unable to parse bindings. Message: ReferenceError: ticketViewModel is not defined; Bindings value: foreach: ticketViewModel.Ticket"

Любая помощь была бы принята с благодарностью.

ответ

1

Попробуйте вместо этого:

<tbody data-bind="foreach: Ticket"> 
    <tr> 
     <td data-bind="text: Name"></td> 
     <td data-bind="text: Price"></td> 
     <td data-bind="text: Quantity"></td> 
    </tr> 
</tbody> 

Наручники всегда относительно текущего контекста. Когда вы говорите ko.applyBindings(ticketViewModel);, вы устанавливаете контекст «корень» на ticketViewModel. Затем, когда вы используете «foreach», вы добавляете новый контекст, а привязки внутри «foreach» теперь относятся к каждому элементу Ticket.

+0

Я пробовал это и все еще не удалось. Немного информации, о которой я не упоминал, является то, что к этой странице прикреплены две модели. Другая модель «eventViewModel» имеет только ko.observables, также загружается через плагин сопоставления, и я использую «eventViewModel.Name» для привязки к имени события. Все хорошо работает с этой моделью. – digitzfone

+0

Если у вас есть несколько ViewModel на странице, вы должны либо: 1) Создайте большую ViewModel, которая содержит две подмодули и выполните 'ko.applyBindings (viewModel);', а затем используйте привязку 'with: ticketViewModel' для область области к подмодельной модели. 2) Используйте форму 'ko.applyBindings (ticketViewModel, document.getElementById ('someElementId'));' чтобы установить модель корневого представления для определенного раздела DOM. –

+0

Я смущен ... Либо: ...? Неужели неудовлетворительная практика состоит в том, чтобы иметь несколько моделей просмотра на странице? – digitzfone