Почему моя вычисляемая функция не добавляется к каждому элементу в моем наблюдаемом массиве нокаута?

Мой наблюдаемый массив имеет две строки (элементы?), строка [0] имеет pid = 2; строка [1] имеет pid = 3.

Я пытаюсь добавить поле в наблюдаемый массив с именем cartItems. Это похоже на добавление столбца в электронную таблицу Excel или в математическую матрицу.

Следующий код не выдает никаких ошибок, но также не вычисляет значение self.myTest( i5 всегда получает ответ по умолчанию, равный нулю. Почему?

self.cartItems = ko.mapping.fromJS(cartItems);

    self.myTest = ko.computed(function(){
        var ans =0;
        ko.utils.arrayForEach(self.cartItems, function(item) {
        ans =  ko.utils.unwrapObservable(item.pid());
    });
    return "myTest="+ans;
},self);

person Ann Maybury    schedule 28.02.2014    source источник
comment
Есть ли шанс, что вы можете собрать пример jsfiddle?   -  person Joe    schedule 01.03.2014
comment
Джо... Я пытаюсь создать скрипку. Я начал с того, что скопировал то, что сделал Иван, в новую скрипку. это не выполнялось для меня. Я думаю, что мне нужно добавить внешний ресурс Knockout.mapint-latest-debug.js, но не знаю, как это сделать. Кнопка плюс мне ни о чем не говорит. Вы можете посоветовать?   -  person Ann Maybury    schedule 01.03.2014


Ответы (1)


Попробуйте использовать ko.utils.arrayForEach(self.cartItems(), ... вместо ko.utils.arrayForEach(self.cartItems, .... (с ()). Скрипка.

Обновление:
Посмотрите обновленный Fiddle, чтобы решить вашу проблему. с возможностью добавления нового свойства в строку (элемент).

person Ivan.Srb    schedule 28.02.2014
comment
В вашем массиве fiddle не наблюдается, поэтому нет причин добавлять () (выполнить) к self.cartItems и item.pid, и он работает хорошо. Но если я правильно понимаю вопрос (я пытаюсь добавить поле в наблюдаемый массив) - массив должен быть наблюдаемым. :) - person Ivan.Srb; 01.03.2014
comment
Я новичок в этом деле и поэтому не совсем понимаю ваши комментарии. - person Ann Maybury; 01.03.2014
comment
@AnnMaybury Мой комментарий был адресован Джо. Для вас я создал эту скрипту: jsfiddle.net/Ivan_Srb/A3F5j/1 и написал о вашей ошибке в ответ. - person Ivan.Srb; 01.03.2014
comment
Я попробовал эту скрипку, и она не работает, когда массив многомерный. Он добавляет в ваш массив то, что по сути является другим (строкой) = элементом. у меня есть такой массив. var cartItems = [{id:0,pid: 2,ix:5, {id:1,pid: 3,ix:6}]; Я хочу добавить новое поле в каждую строку (элемент), чтобы массив стал - person Ann Maybury; 01.03.2014
comment
@AnnMaybury Вы можете обновить мою скрипку с вашей проблемой и поделиться ссылкой, и тогда я попытаюсь ее решить. - person Ivan.Srb; 01.03.2014
comment
Я пытаюсь создать эту скрипку. - person Ann Maybury; 01.03.2014