Модераторы: Sardar, Aliance
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Подписка на событие JS, назначить каждому объекту свою функцию 
V
    Опции темы
SAVe
Дата 21.12.2015, 14:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 84
Регистрация: 15.10.2007

Репутация: нет
Всего: нет



Здравствуйте

Есть вот такой JS код:
Код

function sm()
{
....
this.OnComplete = function () {       
        
       // OnComplete вызывается в для результата ajax запроса
       ....
        sm.OnUpdate(); // вызов foo() происходит

    }   
}

function foo(){alert('Ok')}

sm.OnUpdate = foo;



Код работает , но OnUpdate это как бы "статический" метод. Он будет для всех экземпляров sm одно и то же вызывать
Как его сделать "экземплярным" ? Т.е. что бы это работало в таком сценарии:
Код

function sm()
{
....
this.OnComplete = function () {       
        
       // OnComplete вызывается по окончании ajax запроса
       ....
        this.OnUpdate(); // Ошибка: Объект не поддерживает свойство или метод "OnUpdate"

    }   
}

sm.prototype.OnUpdate = function(){};

var smObj1 = new sm();
var smObj2 = new sm();

function foo1(){alert('Ok')}
function foo2(){alert('Not Ok')}


smObj1.OnUpdate = foo1;
smObj2.OnUpdate = foo2;



Заранее благодарю за ответы. 

PM MAIL   Вверх
ksnk
Дата 21.12.2015, 17:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 84
Всего: 386



Если не переносить куда-нибудь в другое место кода - то грязно можно решить так
Код

smObj1.OnUpdate = function(){return foo1.call(smObj1)};
smObj2.OnUpdate = function(){return foo2.call(smObj2)};


Хотя, скорее всего - нужно OnComplete вызвать правильно, через call или apply, чтобы this не терялся.


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
SAVe
Дата 23.12.2015, 13:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 84
Регистрация: 15.10.2007

Репутация: нет
Всего: нет



Цитата(ksnk @ 21.12.2015,  17:27)

нужно OnComplete вызвать правильно, через call или apply, чтобы this не терялся.


Спасибо большое. Действительно терялся this.

Мой код генерировал такую разметку:
Код

<form ... data-ajax-complete="smObj1.OnComplete" ...>


OnComplete вызывался , но терял this. Заменил на такой вызов (со скобками) и всё заработало:
Код

<form ... data-ajax-complete="smObj1.OnComplete()" ...>


Окончательный вариант скрипта:

Код

function sm() 


this.OnUpdate;
.... 
this.OnComplete = function () {        
         
       // OnComplete вызывается по окончании ajax запроса 
       .... 
        this.OnUpdate(); 
    }    


var smObj1 = new sm(); 
 
function foo1(){alert('Ok')} 
 
smObj1.OnUpdate = foo1; 




PM MAIL   Вверх
ksnk
Дата 24.12.2015, 12:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 84
Всего: 386



А как исполняется код из атрибута data-ajax-complete? eval'ом?

Этот ответ добавлен с нового Винграда - http://vingrad.com
PM MAIL WWW Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию.
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0477 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.