Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > JavaScript: Общие вопросы > Подписка на событие JS


Автор: SAVe 21.12.2015, 14:40
Здравствуйте

Есть вот такой 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;



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

Автор: ksnk 21.12.2015, 17:27
Если не переносить куда-нибудь в другое место кода - то грязно можно решить так
Код

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


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

Автор: SAVe 23.12.2015, 13:12
Цитата(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; 




Автор: ksnk 24.12.2015, 12:21
А как исполняется код из атрибута data-ajax-complete? eval'ом?

Этот ответ добавлен с нового Винграда - http://ru.vingrad.com/Podpiska-na-sobytiye-JS-id5677e58cae20151d4d8b4568#findElement_E7045_567bb91eae2015426f150584_0

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)