Здесь код, взятый с сайта учебника Knockout.js:
function SeatReservation(name, initialMeal) {
var self = this;
self.name = name;
self.meal = ko.observable(initialMeal);
}
//View Model along with initialState
function ReservationsViewModel() {
var self = this;
//Non-edible data
self.availableMeals = [
{mealName:"sandwhich", price: 0 },
{mealName: "Ribs", price:25 },
{mealName: "Steak", price: 50}
];
//Edible data
self.seats = ko.observableArray([
new SeatReservation("Steve", self.availableMeals[0]),
new SeatReservation("Bert", self.availableMeals[0])
ko.applybindings(new ReservationsViewModel()):
Вид:
<tbody data-bind="foreach: seats">
<td data-bind = "text:name"></td>
<td data-bind = "text: meal().mealName"></td>
<td data-bind = "text: meal().price"></td>
То, что я не понимаю, - это то, почему мнение вызывает еду(). FoodName и еда(). Я ожидал, что это будет еда(). AvailableMeals.mealName и meal(). AvailableMeals.price
Если вы ссылаетесь на шаг 2 из 5 в учебном пособии "Работа со списками и коллекциями", причина, по которой вы называете еду(). FoodName и meal(). Цена - это потому, что, если вы заметили, у вас есть это представление SeatReservation в этот код:
// Class to represent a row in the seat reservations grid
function SeatReservation(name, initialMeal) {
var self = this;
self.name = name;
self.meal = ko.observable(initialMeal);
}
Обратите внимание, что одним из наблюдаемых привязок является self.meal
. Это означает, что в ReservationsViewModel имеется массив SeatReservations (который представлен self.seats и наблюдаемым массивом), который каждый SeatReservation содержит еду.
Единственная цель доступныхMeals - предоставить данные, которые вы будете использовать для заполнения возможностей приема пищи, но на самом деле это не представление самих данных модели. (availableMeals можно было легко прочитать из базы данных и таким образом заполнить данные).
Как это работает в этом конкретном фрагменте кода, когда создается резервирование места, он ожидает имя и initialMeal. Для целей этого руководства это функция addSeat:
self.addSeat = function() {
self.seats.push(new SeatReservation("", self.availableMeals[0]));
}
Обратите внимание, что сама ReservationsViewModel создает новую SeatReservation и передает данные availableMeal (помните, что это может происходить из базы данных), чтобы, в конечном счете, заполнить ViewModel, чтобы ваше представление обновилось.