Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 16.07.2016, 14:16
Новичок на форуме
Отправить личное сообщение для PMaster Посмотреть профиль Найти все сообщения от PMaster
 
Регистрация: 16.07.2016
Сообщений: 9

Как асинхронно вызвать метод?
Пишу плагин для jQuery. В настройках плагина есть объект, содержащий метод render:

columns: {
            id: {
                name: '',
                isSearch: false,
                isSortable: true,
                render: function (content) {
                    return '<td>' + content[id] + '</td>';
                }
            },


В метод render передаю объект content. Код выполняется асинхронно.
Получаю ошибку:

ReferenceError: id is not defined


Код, из которого вызывается метод:

var request = ajax.index(settings);
request.done(function(result) {
            for (var column in result) {
                html += settings.columns[column].render(content);
            }
        }


Сам объект content:

Object { id=1, type="main", parameter="sitename", ...}


Мне нужно получить доступ к свойствам объекта content в методе render. Подскажите, пожалуйста, как правильно это сделать?
Ответить с цитированием
  #2 (permalink)  
Старый 16.07.2016, 14:48
Новичок на форуме
Отправить личное сообщение для PMaster Посмотреть профиль Найти все сообщения от PMaster
 
Регистрация: 16.07.2016
Сообщений: 9

Есть такой вариант на костылях:

render: function (content) {
                    if (typeof content !== 'undefined') if (typeof content.id !== 'undefined') {
                        return '<td>' + content.id + '</td>';
                    }
                }


Так работает и всё же хотелось бы более грамотное решение. Что бы не писать if (typeof content !== 'undefined') в каждом такой функции.
Ответить с цитированием
  #3 (permalink)  
Старый 16.07.2016, 15:14
Аватар для destus
Профессор
Отправить личное сообщение для destus Посмотреть профиль Найти все сообщения от destus
 
Регистрация: 18.05.2011
Сообщений: 1,207

return '<td>' + content['id'] + '</td>';
Ответить с цитированием
  #4 (permalink)  
Старый 16.07.2016, 15:27
Новичок на форуме
Отправить личное сообщение для PMaster Посмотреть профиль Найти все сообщения от PMaster
 
Регистрация: 16.07.2016
Сообщений: 9

Сообщение от destus Посмотреть сообщение
return '<td>' + content['id'] + '</td>';

Так тоже не работает.

Ответить с цитированием
  #5 (permalink)  
Старый 16.07.2016, 15:31
Аватар для destus
Профессор
Отправить личное сообщение для destus Посмотреть профиль Найти все сообщения от destus
 
Регистрация: 18.05.2011
Сообщений: 1,207

PMaster,
потому что здесь
for (var column in result) {
                html += settings.columns[column].render(content);
            }

content нигде не определяется.
Ответить с цитированием
  #6 (permalink)  
Старый 16.07.2016, 19:13
Новичок на форуме
Отправить личное сообщение для PMaster Посмотреть профиль Найти все сообщения от PMaster
 
Регистрация: 16.07.2016
Сообщений: 9

Сообщение от destus Посмотреть сообщение
PMaster,
потому что здесь
for (var column in result) {
                html += settings.columns[column].render(content);
            }

content нигде не определяется.
Определяется. Я просто из контекста вырвал кусок кода. Если там console.log(content) сделать, то все Ok.
Ответить с цитированием
  #7 (permalink)  
Старый 16.07.2016, 19:37
Аватар для Erolast
Профессор
Отправить личное сообщение для Erolast Посмотреть профиль Найти все сообщения от Erolast
 
Регистрация: 24.09.2013
Сообщений: 1,436

Сообщение от destus Посмотреть сообщение
return '<td>' + content['id'] + '</td>';
Какая разница?

Цитата:
Определяется. Я просто из контекста вырвал кусок кода. Если там console.log(content) сделать, то все Ok.
Значит, объявляется, но не определяется.
В консоли написано undefined - значит, undefined. Браузеру виднее.
Ответить с цитированием
  #8 (permalink)  
Старый 16.07.2016, 20:04
Аватар для destus
Профессор
Отправить личное сообщение для destus Посмотреть профиль Найти все сообщения от destus
 
Регистрация: 18.05.2011
Сообщений: 1,207

Цитата:
Какая разница?
let obj = {id: 123},
	s;
	
	try{
		s = 'keeeek' + obj[id];
		alert(s);
	}
	catch(e){
		alert(e);
	}

	try{
		s = 'blablabla' + obj['id'];
		alert(s);
	}
	catch(e){
		alert(e);
	}
Ответить с цитированием
  #9 (permalink)  
Старый 16.07.2016, 20:34
Аватар для Erolast
Профессор
Отправить личное сообщение для Erolast Посмотреть профиль Найти все сообщения от Erolast
 
Регистрация: 24.09.2013
Сообщений: 1,436

А. Я с этим вариантом сравнивал:
Цитата:
return '<td>' + content.id + '</td>';

Последний раз редактировалось Erolast, 17.07.2016 в 04:19.
Ответить с цитированием
  #10 (permalink)  
Старый 16.07.2016, 22:48
Новичок на форуме
Отправить личное сообщение для PMaster Посмотреть профиль Найти все сообщения от PMaster
 
Регистрация: 16.07.2016
Сообщений: 9

Сообщение от Erolast Посмотреть сообщение
Значит, объявляется, но не определяется.
В консоли написано undefined - значит, undefined. Браузеру виднее.

Могу сказать, почему в браузере - undefined. Выше писал, что код асинхронно работает. При инициализации настроек jQuery плагина метод render почему-то запускается, при этом никаких данных никто ему не отправлял.

Видимо это происходит при объединении настроек:
settings = $.extend(true, {}, defaults, options);


На данный момент я добавил еще один параметр async. При асинхронном вызове явно задаю параметр в true:

render: function (async, content) {
    if (async == true) return '<td>' + content.id + '</td>';
 }


Такой код работает, правда с костылем.
Ответить с цитированием
Ответ


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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как вызвать метод? ibolgenos Общие вопросы Javascript 22 20.09.2014 00:04
Как вызвать функцию из переменной? sss2019 Общие вопросы Javascript 7 02.09.2014 13:34
как вызвать анонимную функцию которая находится в подключенном файле(.js) arsen97 Общие вопросы Javascript 3 03.08.2014 00:23
Управление скроллом "а-ля тач" HonesT Элементы интерфейса 2 27.08.2013 14:25
Как вызвать функцию из функции ? PheonixS AJAX и COMET 7 20.06.2010 09:51