Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Массив остается пустым (https://javascript.ru/forum/misc/53348-massiv-ostaetsya-pustym.html)

She-Wolf 30.01.2015 14:41

Массив остается пустым
 
в 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());

tsigel 30.01.2015 15:03

Вы опубликовали очень много кода.
Пожалуйста, локализуйте проблему!
Выделите фрагмент кода, по которому есть вопрос и опубликуйте его отдельно.
И, по возможности, уберите из кода мусор, чтобы нам легче было сориентироваться и помочь решить вашу проблему.
Спасибо.
P.S. код форматируют специальные теги [ js ] ... [/js], [ html ] ... [/html] и другие аналогичные, сам. http://javascript.ru/formatting

She-Wolf 30.01.2015 16:20

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("Произошла ошибка!"); }
        });
    }

tsigel 30.01.2015 16:26

self.engines - это не массив судя по тому что написано в этом коде. Это либо объект наследник массива, в таком случае смотрите где напортачили в прототипах, либо массив с измененным прототипом (что вообще нельзся делать).

Ну или это нечто вообще не связанное с массивом :)

остановите в отладчике код на строке 10 и выведите в консоль следующее:

1) self.engines
2) self.engines instanceof Array
3) self.engines.push

Смотрите ошики в консоли.

She-Wolf 30.01.2015 16:48

Цитата:

Сообщение от She-Wolf (Сообщение 354260)
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("Произошла ошибка!"); }
        });
    }

Цитата:

Сообщение от tsigel (Сообщение 354262)
self.engines - это не массив судя по тому что написано в этом коде. Это либо объект наследник массива, в таком случае смотрите где напортачили в прототипах, либо массив с измененным прототипом (что вообще нельзся делать).

Ну или это нечто вообще не связанное с массивом :)

остановите в отладчике код на строке 10 и выведите в консоль следующее:

1) self.engines
2) self.engines instanceof Array
3) self.engines.push

Смотрите ошики в консоли.


self.engines = ko.observableArray([]); - что это ,если не массив?

tsigel 30.01.2015 16:55

Цитата:

Сообщение от She-Wolf
self.engines = ko.observableArray([]); - что это ,если не массив?

She-Wolf,
Во первых я понятия не имею что такое ko.observableArray([]) и что оно возвращает, так что на этот вопрос я вам не отвечу. Во вторых у массива в javascript нет методов "destroyAll", "valueWillMutate" и уж точно это не функция как тут: "self.engines([])"

tsigel 30.01.2015 17:05

She-Wolf,
ММмм, я не прав, простите. Почитал про knockout.js

Есть 2 варианта.
1) Вы спрашиваете содержимое массива до ответа от сервера
2) От сервера не пришли данные.

She-Wolf 30.01.2015 17:28

Цитата:

Сообщение от tsigel (Сообщение 354267)
She-Wolf,
ММмм, я не прав, простите. Почитал про knockout.js

Есть 2 варианта.
1) Вы спрашиваете содержимое массива до ответа от сервера
2) От сервера не пришли данные.

tsigel,
1) Нет. Код выполняется при успешном запросе ajax
2) Пришли, смотрели значения- построчно трассировала в F12

Просто проблема в том что этот код прекрасно работает в другом проекте, один в один, только переменные другие.

tsigel 30.01.2015 17:40

She-Wolf,
Ставьте точку остановки в success и смотрите как кладутся данные

She-Wolf 30.01.2015 18:35

Цитата:

Сообщение от tsigel (Сообщение 354272)
She-Wolf,
Ставьте точку остановки в success и смотрите как кладутся данные

tsigel,
Говорю же, все это сделано и данные НЕ кладутся в принципе.
Данные пришли от сервера. Но в массив не попадают.


Часовой пояс GMT +3, время: 22:30.