30.01.2015, 14:41
|
Новичок на форуме
|
|
Регистрация: 30.01.2015
Сообщений: 5
|
|
Массив остается пустым
в 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());
|
|
30.01.2015, 15:03
|
Профессор
|
|
Регистрация: 12.12.2012
Сообщений: 1,398
|
|
Вы опубликовали очень много кода.
Пожалуйста, локализуйте проблему!
Выделите фрагмент кода, по которому есть вопрос и опубликуйте его отдельно.
И, по возможности, уберите из кода мусор, чтобы нам легче было сориентироваться и помочь решить вашу проблему.
Спасибо.
P.S. код форматируют специальные теги [ js ] ... [/js], [ html ] ... [/html] и другие аналогичные, сам. http://javascript.ru/formatting
|
|
30.01.2015, 16:20
|
Новичок на форуме
|
|
Регистрация: 30.01.2015
Сообщений: 5
|
|
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("Произошла ошибка!"); }
});
}
|
|
30.01.2015, 16:26
|
Профессор
|
|
Регистрация: 12.12.2012
Сообщений: 1,398
|
|
self.engines - это не массив судя по тому что написано в этом коде. Это либо объект наследник массива, в таком случае смотрите где напортачили в прототипах, либо массив с измененным прототипом (что вообще нельзся делать).
Ну или это нечто вообще не связанное с массивом
остановите в отладчике код на строке 10 и выведите в консоль следующее:
1) self.engines
2) self.engines instanceof Array
3) self.engines.push
Смотрите ошики в консоли.
Последний раз редактировалось tsigel, 30.01.2015 в 16:31.
|
|
30.01.2015, 16:48
|
Новичок на форуме
|
|
Регистрация: 30.01.2015
Сообщений: 5
|
|
|
|
30.01.2015, 16:55
|
Профессор
|
|
Регистрация: 12.12.2012
Сообщений: 1,398
|
|
Сообщение от She-Wolf
|
self.engines = ko.observableArray([]); - что это ,если не массив?
|
She-Wolf,
Во первых я понятия не имею что такое ko.observableArray([]) и что оно возвращает, так что на этот вопрос я вам не отвечу. Во вторых у массива в javascript нет методов "destroyAll", "valueWillMutate" и уж точно это не функция как тут: "self.engines([])"
Последний раз редактировалось tsigel, 30.01.2015 в 17:02.
|
|
30.01.2015, 17:05
|
Профессор
|
|
Регистрация: 12.12.2012
Сообщений: 1,398
|
|
She-Wolf,
ММмм, я не прав, простите. Почитал про knockout.js
Есть 2 варианта.
1) Вы спрашиваете содержимое массива до ответа от сервера
2) От сервера не пришли данные.
|
|
30.01.2015, 17:28
|
Новичок на форуме
|
|
Регистрация: 30.01.2015
Сообщений: 5
|
|
Сообщение от tsigel
|
She-Wolf,
ММмм, я не прав, простите. Почитал про knockout.js
Есть 2 варианта.
1) Вы спрашиваете содержимое массива до ответа от сервера
2) От сервера не пришли данные.
|
tsigel,
1) Нет. Код выполняется при успешном запросе ajax
2) Пришли, смотрели значения- построчно трассировала в F12
Просто проблема в том что этот код прекрасно работает в другом проекте, один в один, только переменные другие.
Последний раз редактировалось She-Wolf, 30.01.2015 в 17:34.
|
|
30.01.2015, 17:40
|
Профессор
|
|
Регистрация: 12.12.2012
Сообщений: 1,398
|
|
She-Wolf,
Ставьте точку остановки в success и смотрите как кладутся данные
|
|
30.01.2015, 18:35
|
Новичок на форуме
|
|
Регистрация: 30.01.2015
Сообщений: 5
|
|
Сообщение от tsigel
|
She-Wolf,
Ставьте точку остановки в success и смотрите как кладутся данные
|
tsigel,
Говорю же, все это сделано и данные НЕ кладутся в принципе.
Данные пришли от сервера. Но в массив не попадают.
Последний раз редактировалось She-Wolf, 30.01.2015 в 19:04.
|
|
|
|