Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 30.01.2015, 14:41
Новичок на форуме
Отправить личное сообщение для She-Wolf Посмотреть профиль Найти все сообщения от She-Wolf
 
Регистрация: 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());
Ответить с цитированием
  #2 (permalink)  
Старый 30.01.2015, 15:03
Профессор
Отправить личное сообщение для tsigel Посмотреть профиль Найти все сообщения от tsigel
 
Регистрация: 12.12.2012
Сообщений: 1,398

Вы опубликовали очень много кода.
Пожалуйста, локализуйте проблему!
Выделите фрагмент кода, по которому есть вопрос и опубликуйте его отдельно.
И, по возможности, уберите из кода мусор, чтобы нам легче было сориентироваться и помочь решить вашу проблему.
Спасибо.
P.S. код форматируют специальные теги [ js ] ... [/js], [ html ] ... [/html] и другие аналогичные, сам. http://javascript.ru/formatting
Ответить с цитированием
  #3 (permalink)  
Старый 30.01.2015, 16:20
Новичок на форуме
Отправить личное сообщение для She-Wolf Посмотреть профиль Найти все сообщения от She-Wolf
 
Регистрация: 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("Произошла ошибка!"); }
        });
    }
Ответить с цитированием
  #4 (permalink)  
Старый 30.01.2015, 16:26
Профессор
Отправить личное сообщение для tsigel Посмотреть профиль Найти все сообщения от tsigel
 
Регистрация: 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.
Ответить с цитированием
  #5 (permalink)  
Старый 30.01.2015, 16:48
Новичок на форуме
Отправить личное сообщение для She-Wolf Посмотреть профиль Найти все сообщения от She-Wolf
 
Регистрация: 30.01.2015
Сообщений: 5

Сообщение от She-Wolf Посмотреть сообщение
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 Посмотреть сообщение
self.engines - это не массив судя по тому что написано в этом коде. Это либо объект наследник массива, в таком случае смотрите где напортачили в прототипах, либо массив с измененным прототипом (что вообще нельзся делать).

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

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

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

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

self.engines = ko.observableArray([]); - что это ,если не массив?
Ответить с цитированием
  #6 (permalink)  
Старый 30.01.2015, 16:55
Профессор
Отправить личное сообщение для tsigel Посмотреть профиль Найти все сообщения от tsigel
 
Регистрация: 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.
Ответить с цитированием
  #7 (permalink)  
Старый 30.01.2015, 17:05
Профессор
Отправить личное сообщение для tsigel Посмотреть профиль Найти все сообщения от tsigel
 
Регистрация: 12.12.2012
Сообщений: 1,398

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

Есть 2 варианта.
1) Вы спрашиваете содержимое массива до ответа от сервера
2) От сервера не пришли данные.
Ответить с цитированием
  #8 (permalink)  
Старый 30.01.2015, 17:28
Новичок на форуме
Отправить личное сообщение для She-Wolf Посмотреть профиль Найти все сообщения от She-Wolf
 
Регистрация: 30.01.2015
Сообщений: 5

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

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

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

Последний раз редактировалось She-Wolf, 30.01.2015 в 17:34.
Ответить с цитированием
  #9 (permalink)  
Старый 30.01.2015, 17:40
Профессор
Отправить личное сообщение для tsigel Посмотреть профиль Найти все сообщения от tsigel
 
Регистрация: 12.12.2012
Сообщений: 1,398

She-Wolf,
Ставьте точку остановки в success и смотрите как кладутся данные
Ответить с цитированием
  #10 (permalink)  
Старый 30.01.2015, 18:35
Новичок на форуме
Отправить личное сообщение для She-Wolf Посмотреть профиль Найти все сообщения от She-Wolf
 
Регистрация: 30.01.2015
Сообщений: 5

Сообщение от tsigel Посмотреть сообщение
She-Wolf,
Ставьте точку остановки в success и смотрите как кладутся данные
tsigel,
Говорю же, все это сделано и данные НЕ кладутся в принципе.
Данные пришли от сервера. Но в массив не попадают.

Последний раз редактировалось She-Wolf, 30.01.2015 в 19:04.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как в шаблоне диррективы узнать массив это или строка? delias Angular.js 1 18.03.2014 07:33
Отправить, когда четко соберется массив vas88811 Events/DOM/Window 11 26.02.2014 21:55
Массив объектов doox911 Библиотеки/Тулкиты/Фреймворки 6 16.01.2014 22:36
Как создать многомерный массив FRIE Общие вопросы Javascript 29 02.06.2010 19:14
Подскажите, как вернуть js-скрипт массив Polkan AJAX и COMET 18 30.04.2010 23:30