2016-11-11 11 views
0

У меня есть объект Javascript сделал так:Javascript подписаться на функцию обратного вызова после того, как при создании экземпляра

function App(callback){ 

// Call some "long running functions meant for initialization 
callback(this); 

} 

В моей главной странице шаблона (_Layout.cshtml на ASP MVC) Я его создании экземпляра, как это:

_Layout.cshtml

var oApp = new App(function(initializedApp){ 

    // Instanciate here other Javascript components that depend on 
    // App initialization 
    var oComponent1 = new Component1(initializedApp); 
}); 

Это прекрасно работает! Компонент1 инициализирован afte. Приложение завершило инициализацию, и все идет хорошо.

Оценка ошибок в Page1.cshtml (которая отображается внутри _Layout.cshtml и имеет доступ к oApp). Page1 также должен инициализировать свой собственный компонент, для которого приложение должно быть полностью инициализировано.

Page1.cshtml

// How do I "subscribe to the App callback function so that Compnent2, s 
// specific to the Page1.cstml, is initialized afetr App has finished 
// its initialization ??? 
var oComponent2 = new Compnent2(oApp); 

oApp.callback(); // ??? 
oApp(function(initializedApp){ // code here... }); //??? 

Благодаря

Lorenzo

ответ

0

Ваш бег с интересным рисунком. Я бы предложил использовать более ненавязчивый способ инициализации и вызова javascript. Я бы сказал, что большинство вызовов JS в CSHTML можно рассматривать как запах кода.

В любом случае, я отвечу на ваш вопрос. Я хотел бы изменить App, чтобы иметь возможность регистрировать обратные вызовы:

function App(callbacks) 
{ 
    var self = this; 
    self.callbacks = []; 
    self.addCallbacks = function(newCallbacks) 
    { 
     //allow either a single callback or an array of callbacks 
     if(isFunction(callbacks) 
     { 
      self.callbacks.push(newCallbacks); //single callback 
     } 
     else 
     { 
      for(var i = 0; i < newCallbacks.length; i++) 
      { 
       //theoretically, you can have multi-dimensional arrays of callbacks, but that's just excessive 
       self.addCallbacks(newCallbacks[i]); 
      } 
     } 
    }; 
    self.addCallbacks(callbacks); 

    //some point later, call all the callbacks: 
    for(var i = 0; i < self.callbacks.length; i++) 
    { 
     self.callbacks[i](this); 
    } 
} 

Тогда в вашем Page1.cshtml:

var oComponent2 = new Compnent2(oApp); 
var mycallback = function(initializedApp){ // code here... }; 
oApp.addCallbacks(mycallback); 

//or, if you have many callbacks to register: 
var mycallbacks = [ 
    function(initializedApp){ // code here... }, 
    function(initializedApp){ // code here... } 
]; 
oApp.addCallbacks(mycallbacks); 

isFunction заимствованы из here:

var isFunction = function(functionToCheck) 
{ 
    var getType = {}; 
    return functionToCheck && getType.toString.call(functionToCheck) === '[object Function]'; 
} 
+0

Как это предотвращает COMPONENT2 (. ..) для инициализации после того, как приложение завершит процесс инициализации? –

+0

Вы можете переместить создание 'oComponent2' в обратный вызов, который вы зарегистрировали:' var oComponent2; oApp.addCallbacks (function (oApp) {oComponent2 = новый Compnent2 (oApp);}); ' –

+0

Спасибо Джеймсу, я попробую. До сих пор я использовал другое обходное решение, но в любом случае я попробую ваш код. –