2017-10-01 4 views
1

私はAngularJSアプリケーションでコントローラを動的に追加しようとしています。 サブドメインでは、私はanotherController.jsファイルを持っています。

また、私が書いてきた
function anotherControllerWrapper() { 
    return ['$scope', '$state', function ($scope, $state) { 

     $scope.doWork = function() { 
     //...doing some work... 
      alert('work done'); 
     }; 

     $scope.doWork(); 
    }]; 
}; 

runtimeControllerプロバイダは、実行時に$controllerProviderを使用することができるようにする::
はここanotherController.js内容だ私は「

app.config(function($controllerProvider, runtimeControllerProvider) { 
    runtimeControllerProvider.setControllerProvider($controllerProvider); 
}); 

app.provider('runtimeController', function() { 
    var controllerProvider = null; 

    this.setControllerProvider = function (cp) { 
     controllerProvider = cp; 
    }; 

    this.$get = function() { 
     return { 
      registerController: function (controllerName, controllerConstructor) { 
       if (!controllerProvider.has(controllerName)) { 
        controllerProvider.register(controllerName, controllerConstructor); 
       } 
      } 
     }; 
    }; 
}); 

ここではアプリケーションのconfigセクションですm(他のコントローラの中で)httpを介してコントローラのコードを受信すると、s Oそれは次のようになります。

app.controller('testController', ['$scope', '$state', '$http', 'runtimeController', 
    function ($scope, $state, $http, runtimeController) { 

    $http.get('http://someUrl/anotherController.js') 
     .then(
      function(sucess){ 
       var evaluated = new Function('return ' + success.data)(); 
       var ctrl = evaluated(); 
       // routing to ui state with specified 'anotherController' works 
       // no 'anotherController' in app._invokeQueue 
       runtimeController.registerController('anotherController', ctrl); 
       // routing to ui state with specified 'anotherController' constanly fails 
       // 'anotherController' appears in app._invokeQueue 
       //app.controller('anotherController', ctrl); 

       //--registering new UI route with 'anotherController' as controller here 

       $state.go('anotherState'); 

      }, 
      function(error){ alert('something went wrong!'); }, 
     ); 

}]); 

宇井状態も後、私はコントローラを追加している、dymanically追加されます。
$controllerProvider.registermodule.controllerの間に何が起こっているのかを教えてもらえますか?

答えて

2

モジュールメソッド(controllerdirectiveなど)は、アプリケーションの初期化時に実行されるconfigブロック(_configBlocks)を追加します。アプリケーションがconfigフェーズを通過すると、新たに追加されたconfigブロックは実行されないため、app.controller(...)は実行フェーズ中に何の効果もありません。

this exampleとして示し、runtimeController実装は

app.config(($provide, $controllerProvider) => { 
    $provide.value('$controllerProvider', $controllerProvider); 
}); 

evalに簡略化することができる多くの理由のために避けるべきです。スクリプトがCORSによって許可されたドメインからロードされ、evalである必要がないことを考慮すると、スクリプトとしてロードすることをお勧めします。これにより、AngularJS APIにパッチを適用して、ocLazyLoadの機能と同様に、コンポーネントの登録を遅らせることができます。ocLazyLoadは既に使用しています。

+0

これは私が探していたものです。 'eval'に関して - 私はそれを使用しました。なぜなら、正確なスクリプトが何であるかを予測することができないからです。ログイン後にCDNからダウンロードするファイルのリストを受け取ります。 ocLazyLoadに関するアドバイスをいただきありがとうございます - 一見します! – Overrided

+0

ようこそ。スクリプト本体で置き換え(例えば '.controller'を' .config' - APIのパッチを当てることで処理できる)しない限り、evalは必要ありません。$ .getScript、またはSystem.importでスクリプトを読み込むことができます基本的には