Массив остается пустым
в knockout.js тупо не работает push для observableArray. Всю голову сломали уже.
//Model function Engine(id, name, category, power, RPM, weight, dimensions, displacement, imglink) { this.id = ko.observable(id); this.name = ko.observable(name); this.category = ko.observable(category); this.power = ko.observable(power); this.RPM = ko.observable(RPM); this.weight = ko.observable(weight); this.dimensions = ko.observable(dimensions); this.displacement = ko.observable(displacement); this.imglink = ko.observable(imglink); } function Acc(id, name, SKU, URL) { this.id = id; this.name = name; this.SKU = SKU; this.URL = URL; } function Req(param) { this.param = param; } //ViewModel function EngineAccViewModel() { var self = this; self.engines = ko.observableArray([]); // Массив двигателей self.accs = ko.observableArray([]); // Массив аксессуаров self.name = ko.observable(""); // Имя self.category = ko.observable(""); // Тип self.power = ko.observable(""); // Мощность self.RPM = ko.observable(0); // Макс. обороты self.weight = ko.observable(0); // Вес self.dimensions = ko.observable(""); // Габариты self.displacement = ko.observable(""); // Объем двигателя self.imglink = ko.observable(""); // Ссылка на изображение self.page = ko.observable("index"); // Страница // Загрузить двигатели self.loadengines = function(cat) { self.engines.destroyAll(); self.page("engines"); jsRoutes.controllers.Engines.getenginesbycat().ajax({ data: new Req(cat), success: function(data) { self.engines.valueWillMutate(); self.engines([]); for (i = 0; i < data.objects.length; i++) { var o = data.objects[i]; self.engines.push(new Engine(o.id, o.name, o.category.name, o.power, o.RPM, o.weight, o.dimensions, o.displacement, o.imglink)); } self.engines.valueHasMutated(); }, error: function(data) { alert("Произошла ошибка!\n" + data.error()); } }); } // Загрузить двигатели для аксессуара self.loadenginesforacc = function(acc) { self.engines.destroyAll(); self.page("engines"); jsRoutes.controllers.Engines.getenginesbyacc().ajax({ data: new Req(acc), success: function(data) { self.engines.valueWillMutate(); self.engines([]); for (i = 0; i < data.objects.length; i++) { var o = data.objects[i]; self.engines.push(new Engine(o.id, o.name, o.category.name, o.power, o.RPM, o.weight, o.dimensions, o.displacement, o.imglink)); } self.engines.valueHasMutated(); }, error: function(data) { alert("АЛЯРМ ошибка!" + data.error()); } }); } // Загрузить комплектующие self.loadaccs = function(id) { self.accs.destroyAll(); jsRoutes.controllers.Engines.getaccsforengine().ajax({ data: new Req(id), success: function(data) { self.accs.valueWillMutate(); self.accs([]); for (i = 0; i < data.objects.length; i++) { var o = data.objects[i]; self.accs.push(new Acc(o.id, o.name, o.SKU, o.URL)); } self.accs.valueHasMutated(); }, error: function(data) { alert("АЛЯРМ ошибка!\n" + data.error()); } }); } // Загрузить двигатель self.loadengine = function(id) { self.page("engine"); var o = self.engines()[id]; self.name(o.name()); self.category(o.category()); self.power(o.power()); self.RPM(o.RPM()); self.weight(o.weight()); self.dimensions(o.dimensions()); self.displacement(o.displacement()); self.imglink(o.imglink()); self.loadaccs(id); } } ko.applyBindings(new EngineAccViewModel()); |
Вы опубликовали очень много кода.
Пожалуйста, локализуйте проблему! Выделите фрагмент кода, по которому есть вопрос и опубликуйте его отдельно. И, по возможности, уберите из кода мусор, чтобы нам легче было сориентироваться и помочь решить вашу проблему. Спасибо. P.S. код форматируют специальные теги [ js ] ... [/js], [ html ] ... [/html] и другие аналогичные, сам. http://javascript.ru/formatting |
var self = this; self.engines = ko.observableArray([]); // Массив двигателей self.loadengines = function(cat) { self.engines.destroyAll(); self.page("engines"); jsRoutes.controllers.Engines.getenginesbycat().ajax({ data: new Req(cat), success: function(data) { self.engines.valueWillMutate(); self.engines([]); for (i = 0; i < data.objects.length; i++) { self.engines.push(data.objects[i]); } self.engines.valueHasMutated(); }, error: function(data) { alert("Произошла ошибка!"); } }); } |
self.engines - это не массив судя по тому что написано в этом коде. Это либо объект наследник массива, в таком случае смотрите где напортачили в прототипах, либо массив с измененным прототипом (что вообще нельзся делать).
Ну или это нечто вообще не связанное с массивом :) остановите в отладчике код на строке 10 и выведите в консоль следующее: 1) self.engines 2) self.engines instanceof Array 3) self.engines.push Смотрите ошики в консоли. |
Цитата:
Цитата:
self.engines = ko.observableArray([]); - что это ,если не массив? |
Цитата:
Во первых я понятия не имею что такое ko.observableArray([]) и что оно возвращает, так что на этот вопрос я вам не отвечу. Во вторых у массива в javascript нет методов "destroyAll", "valueWillMutate" и уж точно это не функция как тут: "self.engines([])" |
She-Wolf,
ММмм, я не прав, простите. Почитал про knockout.js Есть 2 варианта. 1) Вы спрашиваете содержимое массива до ответа от сервера 2) От сервера не пришли данные. |
Цитата:
1) Нет. Код выполняется при успешном запросе ajax 2) Пришли, смотрели значения- построчно трассировала в F12 Просто проблема в том что этот код прекрасно работает в другом проекте, один в один, только переменные другие. |
She-Wolf,
Ставьте точку остановки в success и смотрите как кладутся данные |
Цитата:
Говорю же, все это сделано и данные НЕ кладутся в принципе. Данные пришли от сервера. Но в массив не попадают. |
Часовой пояс GMT +3, время: 05:12. |