@taicen

Как вызвать методы чтобы они работали, есть ли ограничения или области видимости у методов?

Здравствуйте, пишу небольшой плагин для редактора imperavi и столкнулся с проблемой, а точнее ошибкой 'Uncaught TypeError: undefined is not a function', происходит она следующим образом, есть некая функция которая выводит список файлов в каталоге динамически, я отслеживаю событие клик по файлу и вставляю ссылку на файл в редактор, у редактора есть свой API который выполняет вставку html кода называется insertHtml(), вот как-раз к этому методу я достучаться никак не могу, выходит выше описанная ошибка. Помогите разобраться. Пробовал выводить в alert, без использования метода, событие отрабатывает.

собственно сам код

RedactorPlugins.filemanager = {

init: function()
{
this.buttonAdd('filemanager', 'Filemanager', this.showMyModal);
this.buttonAwesome('filemanager', 'fa-folder');
},

showMyModal: function(){
var callback = $.getJSON('/readdir.php', $.proxy(function(data)
{

var folders = {};

$.each(data, $.proxy(function(key, val) // формируем и храним список каталогов
{
if (typeof val.folder !== 'undefined')
{

folders[val.folder] = val.folder;

}
}, this));

if (!$.isEmptyObject(folders))
{
   $('.redactorfolder').hide();
      var onchangeFunc = function(e)
      {
	var dataF = $(e.target).val();  // при выборе селекта получаем значение пункта (название папки)
	var readList = {};  // контейнер для хранения новых созданных объектов
	var i = 0;

	$('.redactorfolder').remove(); 

	$.each(data, function(key, val) // перебираем ранее полученый список каталогов 
	{
		if (typeof val.folder !== 'undefined' && val.folder == dataF) // если выбранный из селекта каталог соответствует каталогу из списка, то формируем элемент и добавляем его в DOM дерево
		{
                 var list = '<div class="redactorfolder '+ val.folder +'"><span class="del_img">X</span><span class="redactor_clip_link" value="'+i+'"><a href="#">' + val.name + '</a></span></div>';

		$('.otherFm').append(list);
		readList[i] = list;
		i++;
		}
	});

// далее я кликаю по ссылке файла и он должен вставить в редактор
	$('.otherFm').find('.redactorfolder').on('click', '.redactor_clip_link', $.proxy(function(){ 

		var v = $(this).attr('value');
		$.each(readList, $.proxy(function(k, val) // val хранит в себе html код который должен вставляться 
		{
		   if (k == v) {
		   this.insertHtml(val); // здесь выходит ошибка 'Uncaught TypeError: undefined is not a function'
// пробовал через alert, без этого метода все отрабатывает
//как правильно обращаться к этому методу подскажите
		   }
		}, this));
	}, this));
	};

	var select = $('<select id="redactor_image_box_select">');
	$.each( folders, function(k, v)
	{
	select.append( $('<option value="' + v + '">' + k + '</option>'));
	});

	$('.otherFm').append(select);
	select.change(onchangeFunc);

	}

this.selectionSave();
this.modalInit(RLANG.fm, this.opts.modal_fm, 500, callback);

}

};
  • Вопрос задан
  • 2404 просмотра
Решения вопроса 1
@taicen Автор вопроса
ответ был как всегда под носом и это сохранить область видимости в переменной. Путем установки переменной со значением this. Вообщем в JavaScript это называется замыкание
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы