Мои AppModel состоит из наблюдаемого множества комментариевпересматривают нокаут вычислен, который зависит только от наблюдаемого массива
self.comments=ko.observableArray([]); // Default Value is an empty array
/*
Here comes some code to initially fill the observable array
with items from an JSON Response
*/
Кроме того у меня есть два computeds, которые должны представлять самый первый комментарий и последний комментарий
self.firstComment = ko.computed(function() {
var sorted = self.comments.sort(function (left, right) {
return left.Id() - right.Id();
});
return sorted[0];
});
self.lastComment = ko.computed(function() {
var sorted = self.comments.sort(function (left, right) {
return left.Id() - right.Id();
});
return sorted[sorted.length - 1];
});
Это отлично работает при инициализации приложения (загрузка JSON с сервера, создание модели приложения ...), но когда я добавляю комментарий к массиву, вычисленные не распознают, что количество элементов массива изменилось (как я понял, наблюдаемый массив просто наблюдаемое, где наблюдаются свойства массива). Так что, когда я делаю:
self.comments.push(aNewCommentObject);
self.lastComment по-прежнему связан с элементом массива, что это было, когда приложение изначально загружен.
Я нашел this blog post, как заставить вычислить, вводя фиктивный наблюдаемый, но мне не нравится подход. С какой целью наблюдаемый массив используется тогда и как?
Дополнительная проблема: Я бы хотел, чтобы наблюдаемые элементы были отсортированы при любых обстоятельствах (потому что это комментарий, который нужно просто отсортировать в хронологическом порядке). Я попытался сделать это с вычисленным commentsSorted
, но также имеет проблемы, которые это не обновляет, когда у наблюдаемогоArray есть новые элементы, поэтому такая же проблема здесь. Это причина, почему я сортирую каждый раз в firstComment и lastComment.
О, да, это было так. Работая над одним проектом в качестве первого таймера нокаута в течение примерно 2 месяцев, и я действительно боюсь 95% времени, если объект, с которым я сталкиваюсь в данный момент, является наблюдаемым и его необходимо развернуть или нет. Из-за этого код становится намного сложнее, но я надеюсь, что Knockout и я скоро приеду;) Большое спасибо, я думаю, что следующая проблема нокаута не за горами –
Просто используйте 'ko.unwrap' на все. Он будет иметь дело с наблюдаемыми и равными значениями, вам не нужно беспокоиться о том, что (и ваш код становится более гибким таким образом) – Tomalak
@ Jürgen Также: Есть такие вспомогательные функции, которые пригодится, когда 'ko. unwrap() 'недостаточно:' ko.isObservable() ',' ko.isSubscribable() ',' ko.isWriteableObservable() '. – Tomalak