2017-02-15 6 views
0

私の依存関係の一部を遅延ロードするためにrequire.jsを使用しようとしていますが、いくつか問題があります。Angular ui-routingを使用してrequirejsモジュールをロードするように解決する

私は、次のコードは、(角-UI-ルータを経由して)角度neeeds前にそれをレジスタコントローラをロードしようとすべきであると考えている:私は、ログイン状態からレジスタ状態に切り替えたとき、私は、

.state('register', { 
    url: '/register', 
    class: 'login', 
    title: 'Register', 
    templateUrl: 'app/security/register.view.html', 
    controller: 'RegisterController', 
    controllerAs: 'register', 
    resolve: { 
     require: function ($q) { 
     return $q(function (resolve, reject) { 
      console.log('security/register.controller loading') 
      require(['security/register.controller'], function() { 
      console.log('security/register.controller loaded') 
      resolve() 
      }) 
     }) 
     } 
    } 
    }) 

しかし、コンソールで次の出力を得る:

RouteChanged Login 
security/register.controller loading 
security/register.controller loaded 
RouteChanged Register 
Error: [ng:areq] http://errors.angularjs.org/1.5.8/ng/areq?p0=RegisterController&p1=not%20aNaNunction%2C%20got%20undefined 

そう決意が実行されるにもかかわらず、角度はそれがRegisterControllerを見つけることができないというエラーがスローされます。


Here's a link to a plunker.あなたが見ることができるように、コントローラは、あなたがリンクをクリックしたときにロードされず、エラーメッセージがコンソールに表示されます。

答えて

1

は、私は個人的に、ユーザのUIルータ。ここに例があります:

 .state('dashboards.dashboard_2', { 
       url: "/dashboard_2", 
       templateUrl: "views/dashboard_2.html", 
       data: { pageTitle: 'Dashboard 2' }, 
       resolve: { 
        loadPlugin: function ($ocLazyLoad) { 
         return $ocLazyLoad.load([ 
          { 
           serie: true, 
           name: 'angular-flot', 
           files: [ 'js/plugins/flot/jquery.flot.js', 'js/plugins/flot/jquery.flot.time.js', 'js/plugins/flot/jquery.flot.tooltip.min.js', 'js/plugins/flot/jquery.flot.spline.js', 'js/plugins/flot/jquery.flot.resize.js', 'js/plugins/flot/jquery.flot.pie.js', 'js/plugins/flot/curvedLines.js', 'js/plugins/flot/angular-flot.js', ] 
          }, 
          { 
           files: ['js/plugins/jvectormap/jquery-jvectormap-2.0.2.min.js', 'js/plugins/jvectormap/jquery-jvectormap-2.0.2.css'] 
          }, 
          { 
           files: ['js/plugins/jvectormap/jquery-jvectormap-world-mill-en.js'] 
          }, 
          { 
           name: 'ui.checkbox', 
           files: ['js/bootstrap/angular-bootstrap-checkbox.js'] 
          } 
         ]); 
        } 
       } 
      }) 
+0

私は自分の答えを投稿した後、それがかなり役に立つと感じました。私はそれをチェックします、ありがとう:) –

+0

ocLazyLoadを調査した後、それは依存関係を処理しないように思われるので、すべてのファイル名を手動で指定する必要があります。本当? –

+0

どうですか?この例では、すべてのスクリプトがモジュールが機能するためのものです。 –

0

このお試しください:それは問題が判明

resolve: { 
     require: function ($q) { 
     //tell ui-router to wait 
     var deferred = $q.defer(); 
      console.log('security/register.controller loading') 

      require(['security/register.controller'], function() { 
      console.log('security/register.controller loaded') 
      deferred.resolve() 
      }); 
     return deferred.promise; 
     } 
+0

私はそれを試みて同じ結果を得ました。興味深いのは、require文を自分のコードの前に追加すると、読み込みに失敗するため、モジュールの整理と読み込みの方法と関係していると思います。 –

+0

コントローラはどのように見えますか?あなたは注入パラメータの1つとして必要ですか? – Valter

+0

私は注入パラメータと注入​​パラメータの両方でそれを試しました。これは、パラメータがなくても正しい順序で呼び出していますが、まだ正しく読み込まれていません。 –

0

は、ブートストラップ後の角度にコントローラを追加することができ、私の誤った仮定、明らかにすることができますし、あなたが事前そうであるようにだけではないのと同じ方法でしたブートストラップブートストラップ後に追加する場合は、コントローラープロバイダーのコピーをキャッシュし、コントローラーをそのプロバイダーに登録する必要があります。私は次のコードを追加しました:

var app = angular.module('app', ['ui.router']) 

var cachedProviders = {} 
    app.config(['$controllerProvider', 
    function(controllerProvider) { 
     cachedProviders.$controllerProvider = controllerProvider; 
    } 
    ]); 
    $(function(){ 
    app.controller = function (name, controller) { 
     console.log('Loading (using post-boostrap loader):', name) 
     cachedProviders.$controllerProvider.register.apply(this, arguments) 
    } 
    }) 

私のアプリケーションモジュールファイルに追加され、動作し始めました。私はこれが否定的な副作用を持っているのかどうかまだ分かりませんが、今のところ私がしたいことをします。 $ ocLazyLoadプロバイダhttps://github.com/ocombe/ocLazyLoad

そのよりシンプルかつ素晴らしい作品と

関連する問題