无法将动态路由从AngularJS 1.2转换为1.6

时间:2017-04-08 11:01:56

标签: javascript angularjs ngroute

在AngularJS 1.2中,我有一些动态加载路由和控制器的代码,这很好用。我想升级到AngularJS 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中将AngularJS版本更改为1.2.16,以确保其在1.2中有效(请记住还要将链接中的hashbang更改为仅#而不是#!)。将其更改回1.6,它不再起作用。

1 个答案:

答案 0 :(得分:0)

这条线有点奇怪。它让你陷入无限循环。

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

不要试图让Angular重新加载,只需调用$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的文档只是说:

  

即使$ location未更改,也会导致$ route服务重新加载当前路由。   因此,ngView创建新范围并重新实现控制器。

所以这应该适用于每个受支持的版本。我预计不会有任何负面影响。这只是你尝试自制的标准方式。