make angular 手动进入编译阶段

Make angular Manually go to compile phase

我正在使用 ocLazyLoad 在 Angular 中按需加载我的模块。这些模块完全不同,我们应该使用服务器检查我们应该加载哪个模块。在使用 ocLazyLoad 之前,我在主视图中加载了这些独立模块的所有串联 js 文件。所以我们正在加载所有这些。

现在很明显我正在按需加载这些文件,这意味着它应该从服务器读取数据并查看应该加载哪些模块并加载一个兆字节的文件,最重要的是 在 angular 开始编译视图之前加载它。

我正在使用 ocLazyLoad 的 promise 来 $compile 视图(正文),但由于它被执行了两次甚至更多次,所以有时我的指令不起作用。

所以我想我有两个选择:

  1. 在模块被 ocLazyLoad 注入和加载后,angular 手动编译视图(我搜索了很多,但找不到方法!!)!

  2. 从服务器读取所需模块列表,并在应用的 运行 阶段甚至 angular.bootstrap 之前使用 LazyLoad。 (我已经这样做了,但是由于 $http 请求是异步完成的,它有时会工作,并且会在 angular 编译之前加载,有时则不会)

如果你能帮助我,我将不胜感激。

spa.run(['$rootScope', '$location', '$route', '$localStore', '$templateCache', 'Analytics', 'preflightValue', '$ocLazyLoad', '$http',
'$compile', function($rootScope, $location, $route, $localStore, $templateCache, Analytics, preflightValue, $ocLazyLoad, $http, $compile ) {
    $rootScope.$on('cfpLoadingBar:completed', function(event, args) {
        angular.element($('body')).addClass('cfp-done');
    });

    $http({
        method: 'POST',
        url: url,
        data: {
            route: "/dashboard"
        },
        headers: {
            // My Headers
        }
    }).success(function (data, status, header, config) {
        var currentModules = $ocLazyLoad.getModules();
        for (var i = 0; i < data.data.cloudwares.length; i++) {
            var moduleName = data.data.cloudwares[i];
            if (currentModules.indexOf(moduleName) === -1 && moduleName !== 'bot-manager') {
                preflightValue.addModule(moduleName);
            }
        }
        $ocLazyLoad.load(preflightValue.modulesList()).then(function () {
            preflightValue.emptyList();
        });
    });
}]);

//更新

请注意我们没有使用 ui-router 或 ngRouter。我们每次使用 $resource.

从服务器获取路由状态

在你的配置文件中尝试使用 lazyload 事件声明路由

app
.config(function ($stateProvider, $urlRouterProvider,ParseProvider){

        .state ('home', {
            url: '/home',
            // templateUrl: 'views/home.html',
            templateUrl: 'views/home.html',
            resolve: {
                loadPlugin: function($ocLazyLoad) {
                    return $ocLazyLoad.load ([
                        {
                            name: 'css',
                            insertBefore: '#app-level',
                            files: [
                                'vendors/bower_components/fullcalendar/dist/fullcalendar.min.css',
                            ],

                        },
                        {
                            name: 'vendors',
                            insertBefore: '#app-level-js',
                            files: [
                                'vendors/sparklines/jquery.sparkline.min.js',
                                'vendors/bower_components/jquery.easy-pie-chart/dist/jquery.easypiechart.min.js',
                                'vendors/bower_components/simpleWeather/jquery.simpleWeather.min.js'
                            ]
                        }
                    ])
                }
            }
        })
})

从这里您可以将任何脚本加载到您的视图中。

我实际上通过问另一个问题解决了这个问题!我所要做的就是 return 两个承诺!

找到解决方案