2013-07-18 2 views
0

Мне нравится, чтобы мой javascript был отделен от файлов классов. Недавно я столкнулся с необходимостью предоставить функцию обратного вызова функции в другом доступе к файлу javascript через точечную нотацию, поскольку эта функция является частью объекта.Запуск функции обратного вызова в исходном поле

Так, например, если у меня есть объект под названием MyObject, и у него есть функция, называемая doSomething, и я хочу иметь обратный вызов для функции doSomething, но я создаю свой экземпляр объекта в другом файле класса и Я передаю свой обратный вызов в файл класса, он запускается в этой области и не входит в область исходного файла.

FirstObject = function(options){ 

    var FirstObject = this; 
    FirstObject.something = "somevalue"; 

    FirstObject.MyObject = new MyObject(); 
    FirstObject.MyObject.doSomething(param1, function(){//I need to be able to reference FirstObject.something here}); 
} 

Я знаю, что могу сделать это, запуская событие во втором, как: $(document).trigger("doSomething-Finished") и слушать это в происходящей документе, но я хотел бы иметь более прямой доступ. Я чувствую, что это возможно, поскольку это работает с обратными вызовами jQuery.

Я видел ответ на этот вопрос: scope when doing OO javascript callbacks

, но я действительно не понимаю, что именно он делает в растворе и, как реализовать это для моей конкретной ситуации.

+0

Я не понимаю. Вы просто * можете * ссылаться на 'FirstObject.something' из этой функции? Вы просто не можете использовать 'this'. – Bergi

+0

Пожалуйста, не путайте (переменную) * область * с ['this'] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/this) * context *! – Bergi

ответ

1

Вы можете использовать «привязку» метод ES5 на функцию обратного вызова, чтобы обеспечить желаемый охват правильно установлен, см MDN documentation.

FirstObject = function(options){ 

    var FirstObject = this; 
    FirstObject.something = "somevalue"; 

    FirstObject.MyObject = new MyObject(); 

    var callback = function(){ 
     // "this" will be a reference to FirstObject, thanks to "bind" call below 
    }; 

    FirstObject.MyObject.doSomething(param1, callback.bind(FirstObject)); 
} 

Другой способ сохранить ссылку на FirstObject - просто использовать инъекцию зависимости. Вот пример использования инъекции конструктора, но вы также можете использовать сеттер функцию:

FirstObject = function(options){ 

    var FirstObject = this; 
    FirstObject.something = "somevalue"; 

    // pass FirstObject to sub object constructor 
    // note that MyObject needs to store the reference for later use 
    FirstObject.MyObject = new MyObject(FirstObject); 


    FirstObject.MyObject.doSomething(param1, function(){//I need to be able to reference FirstObject.something here}); 
} 
0

Вы можете привязать функцию к объекту:

FirstObject = function(options){ 

    var FirstObject = this; 
    FirstObject.something = "somevalue"; 

    FirstObject.MyObject = new MyObject(); 
    FirstObject.MyObject.doSomething(param1, callback_function.bind(FirstObject.something)); 

    function callback_function(){ 
     // this will be FirstObject.something here 
    } 
} 
Смежные вопросы