чтение этого обмена в stackoverflow под названием «Как сопоставить с массивом, исходящим от объекта сервера, используя плагин Knockout Mapping в шаблонах?» (извините, stackoverflow налагает мне ограничения на количество ссылок в сообщении) Я попытался сыграть, используя ответ (jsFiddle: http://jsfiddle.net/ueGAA/1)
так что упражнение заключалось в том, чтобы сделать задачу из учебника knockoutjs на learn.knockoutjs.com под названием «Загрузка и сохранение данных», но с использованием сопоставления нокаутов.
проблема заключается в том, какое объявление ответа в модели представления, которое мне нравится, здесь перенесено в задачу:
var viewModel =
{
tasks : ko.mapping.fromJS(data),
newTaskText: ko.observable(),
incompleteTasks: ko.computed(function() {
return ko.utils.arrayFilter(this.tasks(), function(task) { return !task.isDone() });
}),
// Operations
addTask: function() {
alert('Entering add task, count:' + this.tasks().length);
this.tasks.push(new Task({ title: this.newTaskText() }));
this.newTaskText("");
},
removeTask: function(task) { this.tasks.remove(task) }
}
Дело здесь: внутри объявления ko.computed () this ссылается на окно. Действительно нормально. Правильное поведение может быть получено, если я объявлю ko.computed () после переменной vewmodel.
Сюда:
viewModel.incompleteTasks=ko.computed(function() {
return ko.utils.arrayFilter(viewModel.tasks(), function(task) { return !task.isDone() });
});
Мне это не нравится, потому что он статически ссылается на объект viewModel в анонимной функции.
вопрос в том, как элегантно объявить неполные задачи непосредственно в объявлении модели просмотра? jsFiddle находится здесь http://jsfiddle.net/Yqg8e/
Благодарность