Обработка JSON. Uncaught TypeError: Cannot read property 'xdata' of undefined
Имеется JSON:
{
"elements": {
"group": {
"tmpl": "tmpl-group",
"params": [{
"name": "main1",
"values": ["a", "b"]
}, {
"name": "label1",
"value": "id",
"readonly": true
}]
},
"el": {
"tmpl": "tmpl-el",
"params": [{
"name": "main1",
"values": ["a", "b"]
}, {
"name": "label1",
"value": "id",
"readonly": true
}, {
"name": "text1",
"defvalue": ""
}]
}
},
"xdata": [{
"id": 44,
"type": "group",
"paramvalues": ["a"],
"children": [{
"id": 14,
"type": "el",
"paramvalues": ["b", "name1"]
}]
}, {
"id": 38,
"type": "el",
"paramvalues": ["a", "name2"]
}]
}
Пытаюсь создать новый объект из ветки xdata так, чтоб занести описание типов из ветки elements (это типы) в дерево элементов в xdata. Но когда хочу получить ветку из JSON вылетает ошибка Uncaught TypeError: Cannot read property 'xdata' of undefined. Как будто не задано свойство this.loadedJSON. Это только в хроме. В FF через debugger firebug-a проверял - все срабатывает без ошибок. Вот на скрине дебаггер с результирующим объектом ![]()
function myobj() {
this.loadedJSON;
this.objtree;
};
myobj.prototype.loadJSON = function()
{
var that = this;
$.getJSON('json/test.json', function(data) {
that.loadedJSON = data;
}).fail(function() {
console.log("Ошибка JSON")
});
return this.loadedJSON;
}
myobj.prototype.prepareJSON = function()
{
var json = this.loadedJSON;
var x = json.xdata; // Uncaught TypeError: Cannot read property 'xdata' of undefined
var y = json.elements;
function cc(obj) {
var accum = [];
for (var i = 0; i < obj.length; i++) {
accum[i] = jQuery.extend(true, {}, obj[i]);
accum[i].index = i;
accum[i].t = jQuery.extend(true, {}, y[obj[i].type].params);
accum[i].tmpl = y[obj[i].type].tmpl.toString();
if (obj[i].children)
accum[i].children = cc(obj[i].children);
}
return accum;
};
this.objtree = cc(x);
}
x = new ft();
x.loadJSON();
x.prepareJSON();
Возможно код не очень адекватный, но я только учусь ) |
anton.fed,
Не надо методы и ключи объекта называть одним именем, вы потеряете доступ к методу. |
tsigel,
Поясните, какие именно ключи и методы? |
напишите console.log здесь и скажите, что у вас вышло:
var json = this.loadedJSON; console.log(json); var x = json.xdata; // Uncaught TypeError: Cannot read property 'xdata' of |
skrudjmakdak,
Пишет undefined Хотя если поставить точку останова в дебагере как на скрине выше (на строке x.prepareJSON(); ) и сразу же продолжить выполнение ( F10), то в консоли выводит JSON объект из файла. В хроме не срабатывает никак Хром: ![]() |
вот, в this.prepareJSON у вас undefined. зайдите в network(в хроме так вкладка называется) найдите ваш запрос по адресу "json/test.json" и кликнете по нему, справа у вас появится несколько вкладок: headers, preview, response, cookies. зайдите во вкладку response и посмотрите что у вас там. это должен быть ответ от сервера
|
Посмотрел дебаггером в хроме, свойство this.loadedJSON = undefined после выполнения функции loadJSON.
Получается код работает только в одном случае, если в Firefox-е в дебагере остановить выполнение перед этой функцией. В любом случае я чтото делаю не так. Посдкажите как правильно получить объект из json файла и обработать его. |
skrudjmakdak,
в Response содержимое файла json/test.json, т.е. он загружается корректно |
вы помоему не правильно аякс запрос прописали посм здесь:
http://api.jquery.com/jquery.getjson/
var jqxhr = $.getJSON( "example.json", function() {
console.log( "success" );
})
.done(function() {
console.log( "second success" );
})
.fail(function() {
console.log( "error" );
})
.always(function() {
console.log( "complete" );
});
// Perform other work here ...
// Set another completion function for the request above
jqxhr.complete(function() {
consol
e.log( "second complete" );}); |
хотя подождите, пропишите еще так:
$.getJSON('json/test.json', function(data) {
console.log(data);
that.loadedJSON = data;
}).fail(function() {
имхо не хватает метода done |
Цитата:
сделал вывод через done
myobj.prototype.loadJSON = function()
{
var that = this;
$.getJSON('json/test.json')
.done(function(data){
console.log(data);
that.loadedJSON = data;
})
.fail(function() {
console.log("Ошибка обработки JSON")
});
//return this.loadedJSON;
}
Все то же самое - ошибка в той же строке : Uncaught TypeError: Cannot read property 'xdata' of undefined |
Вот нагородили-то )
Естесно он будет undefined, тк ваш запрос не успевает завершиться, а вы уже запрашиваете результат в следующей строке. |
чудеса, да и только. можете кинуть ваше творение полностью, хочу посмотреть
|
WorM32,
точняк))) чет под вечер туплю |
WorM32,
Подскажите как сделать тогда. |
как то так))
$.getJSON('json/test.json', function(data) {
that.loadedJSON = data;
that.prepareJSON();
}).fail(function() {
|
anton.fed,
уже подсказали один из вариантов) |
Цитата:
Но как теперь мне обращаться к объекту если он не успевает загрузить JSON тут например консоль покажет undefined , т.к. json еще не загрузился. x = new myobj(); x.loadJSON(); console.log(JSON.stringify(x.xdata,null,' ')); /**/ как тут быть? |
можно сделать функцию обратного вызова:
....
myobj.prototype.loadJSON = function(callback)
{
var that = this;
$.getJSON('json/test.json', function(data) {
that.loadedJSON = data;
that.prepareJSON();
if (typeof callback == 'function')
callback(that, true);
}).fail(function() {
console.log("Ошибка JSON");
if (typeof callback == 'function')
callback(that, false);
});
return this.loadedJSON;
}
......
x = new ft();
x.loadJSON(function (obj, success) {
//actions
});
|
Если так:
x.loadJSON(function (obj, success) {
//actions
});
то получается x.loadJSON - это можно сказать инициалиация объекта, все действия с объектом загруженным из json я смогу делать только внутри этой функции? |
| Часовой пояс GMT +3, время: 06:36. |