НЕ используйте ваше текущее решение, например:
$.map(data, function (product){
self.ProductList.push(new ProductDetailsViewModel(product));
})
То, что это работает, не означает, что все в порядке.
Вы должны $ .map при преобразовании данных, чтобы выводить их в другой последовательности.
В вашем случае вы должны использовать $ .each, так как вы хотите выдвинуть «каждый» элемент в массиве.
Обе карты и каждая из них работают одинаково, в том смысле, что они будут выполнять итерацию массива и выполнять обратный вызов для элементов, но с точки зрения семантики вы всегда должны использовать правильный метод для обозначения ваших реальных намерений.
На твоем месте я бы сделал что-то вроде этого:
ko.utils.arrayForEach(data, function(p) {
self.ProductList.push(new ProductDetailsViewModel(p));
});
Обратите внимание на две концепции:
a) Изучите и используйте вспомогательные функции нокаутов, они приходят в руки и превосходят альтернативы jquery (из того, что я вижу / знаю)
б) Вы также должны помнить, как вы обновляете свой список, в зависимости от размера добавляемых вами элементов. Если вы добавляете небольшое количество элементов к каждому обратному вызову, этого должно быть достаточно.
С другой стороны, если производительность начинает становиться проблемой, вы можете работать с базовым массивом, а в конце вставки данных вы можете запустить нокаут-обновление!
Это будет работать так:
var underlyingArray = self.ProductList();
ko.utils.arrayForEach(data, function(p) {
underlyingArray.push(new ProductDetailsViewModel(p));
});
self.ProductList.valueHasMutated();