2017-04-08 11 views
2

AngularJS 1.2では、ルートとコントローラを動的にロードするためのコードがありますが、うまく動作します。私はAngularJS 1.6にアップグレードしたいが、今や私のダイナミクスはもう働かない。AngularJS 1.2から1.6への動的ルートを変換できません

これは、JSファイルをロードし、ルート再計算するために私の古いコードである(私は妥当性のいくつかの検証を持っているように簡略化ビットを、これが基本です):ルックスをロードされている

moduleApp.config(function ($routeProvider, $controllerProvider) { 
    moduleApp.controllerProvider = $controllerProvider.register; 
    moduleApp.routeProvider = $routeProvider; 

    $routeProvider.when('/', { 
     templateUrl: 'startpage.html', 
     controller: 'startpageController' 
    }) 
    .otherwise({ 
     resolve: { 
      deps: function($q, $rootScope, $location) { 
       var deferred = $q.defer(); 

       var modulename = $location.path().split("/")[1]; 

       if (modulename !== null) { 
        // Load the JS using https://github.com/ded/script.js (Old but it works :) 
        $script(modulename + ".js", function() { 
         $rootScope.$apply(function() { 
          $rootScope.$broadcast('$locationChangeSuccess', $location.path(), $location.path()); 
         }); 
        }); 
       } 

       return deferred.promise; 
      } 
     } 
    }); 
}); 

そして、JSファイル

moduleApp.routeProvider. 
    when('/FirstModule', { 
     templateUrl: 'FirstModule.html', 
     caseInsensitiveMatch: true 
    }); 

moduleApp.controllerProvider('firstModuleController', function ($scope) { 
}); 

この場合も、1.2ではうまくいきますが、1.6でルートを適用するともうこのように動作しないと思います。だから私は$rootScopeを使用して、これを再び機能させるために、関数内で何を変更する必要がありますか?それとももっと変える必要がありますか?場合、何?

このコードでPlunkerを作成しました。 index.htmlで1.2.16へ

変更AngularJSバージョン、それは1.2で動作することを確認するために(また、唯一の#代わり#!のようにリンクしてhashbangを変更することを忘れないでください)。それを1.6に戻してください。もう動作しません。

+0

"does not work"を定義してください。 –

+0

私は、Plunkerの "First module"リンクをクリックします。ルートの 'otherwise'部分が呼び出され、FirstModule.jsがロードされます。ただし、モジュールの内容は決して表示されません。 – GTHvidsten

答えて

0

この行は少し奇妙です。それはあなたを無限ループにしていました。マイナーなバグがありました。その代わりに、リロードに角度トリックしようとしているの

$rootScope.$broadcast('$locationChangeSuccess', $location.path(), $location.path()); 

、ちょうどここで$route.reload()

.otherwise({ 
    resolve: { 
     deps: function($q, $rootScope, $location, $http, $route) { 
      var deferred = $q.defer(); 

      var modulename = $location.path().split("/")[1]; 

      if (modulename !== null) { 
       $script(modulename + ".js", function() { 
        $rootScope.$apply(function() { 
         //$rootScope.$broadcast('$locationChangeSuccess', $location.path(), $location.path()); 
         $route.reload(); 
        }); 
       }); 
      } 

      return deferred.promise; 
     } 
    } 
}); 

を呼び出してもworking Plunker

です。応答

 

編集ng-click="FirstButton"に括弧がありませんがコメントする:

放送システムイベント($ locationChangeSuccessを)あなただけの危険な鳴りあったように。ある程度までは、実際にはサポートされていなかったので、1.2で動作したことが幸運になりました。確かに、あなたのコードが主張しているように、場所の変更は成功しませんでした。 reloadため

ドキュメントがちょうど言う:

は$の場所が変更されていない場合でも、現在のルートを再ロードするために$ルートサービスを引き起こします。 その結果、ngViewは新しいスコープを作成し、コントローラを再インスタンス化します。

これはサポートされているすべてのバージョンで動作するはずです。私はいかなる否定的な副作用も予期していません。これは、あなたが自作しようとしたことを行う標準的な方法です。

+0

私はこの解決策に触れましたが、それを行う最良の方法であるかどうかはわかりませんでした。1.2で動作する理由を理論化できますか?1.6ではできません。 '$ route.reload()'には他のアプローチに比べて欠点がありますか? – GTHvidsten

+0

私のPlunkerはこの回答のコードで更新され、将来の訪問者がこれを実際に見ることができるように文書化されています:http://plnkr.co/edit/HnuEcblv8cyDwbGL3smh?p=preview – GTHvidsten

関連する問題