延迟加载基于控制器命名空间约定的外部 JS/CSS 文件?

Posted

技术标签:

【中文标题】延迟加载基于控制器命名空间约定的外部 JS/CSS 文件?【英文标题】:Lazyload external JS/CSS files based on controller namespace convention? 【发布时间】:2012-04-19 10:46:21 【问题描述】:

angularJS 是否有任何东西可以基于 ng-controller 命名空间延迟加载外部 JS/CSS 文件?这样以下内容会将 com.myApp.SomeClass.js 和 com.myApp.SomeClass.css 附加到文档头部?

<div ng-controller="com.myApp.SomeClass"></div>

【问题讨论】:

【参考方案1】:

还没有,但它正在 v1.0 之后的作品中。

您的应用程序是否大到需要它?我们有一些令人印象深刻的大型应用程序,但还没有遇到这种需求,因为控制器比在没有 Angular 的情况下编写相同的行为时要密集得多。

【讨论】:

【参考方案2】:

使用慢脚本怎么样?在 angularjs 上懒加载真的很容易

示例: https://github.com/flrngel/slowscript-angular-require-lazyload

慢速脚本: https://github.com/flrngel/slowscript

来自网站的核心代码

app.js

app = angular.module("mainApp", ["ui.router"]).run(function($rootScope)
    $rootScope.$on('$viewContentLoaded',function()
        slowscript.execute();
    );
);

app.config(function($stateProvider, $urlRouterProvider) 
    $stateProvider.state("sexy", 
        url: "/sexy",
        views: 
            "contents": 
                templateUrl: "/views/test.html",
                controller: "Sexy",
                reloadOnSearch: true
            
        
    );
);

app.controller("Sexy", function($scope) 
    slowscript.queue(function()
        slowscript.$global.sexy($scope);
    );
);

test.html(角度视图模板)

<div ng-controller="Sexy">
    <input list="univ">
        <datalist id="univ">
            <option ng-repeat="univ in univs" value="univ.name"></option>
        </datalist>
    </input>
    <input type="submit"></input>
    <noscript src="test.js" type="text/slowscript"></noscript>
</div>

test.js

require(['angular','slowscript'],function(angular,slowscript)
    slowscript.$global.sexy=(function($scope)
        console.log("tada~");
        $scope.univs = ["idx": 1,"name": "asdf", "idx": 2,"name": "bsdf"];
        $scope.$apply();
    );
    slowscript.queue_execute();
);

【讨论】:

【参考方案3】:

使用原生 AngularJS 1.x 是不可能的

但是,您可以使用$oclazyload 来延迟加载代码文件(js、HTML、CSS)

$ocLazyLoad 与UI-Router 等路由器完美配合。它返回一个承诺并使用resolve 属性来确保在解析视图之前加载文件。

angular.module('myApp', ['ui.router', 'oc.lazyLoad'])
     .config(function($stateProvider, $urlRouterProvider, $ocLazyLoadProvider) 
      $stateProvider
          .state('stateA', 
              url: '/stateA',
              controller: 'StateACtrl',
              templateUrl: 'stateA.html',
              resolve: 
                  load: [ '$ocLazyLoad', function($ocLazyLoad) 
                          return $ocLazyLoad.load([
                              
                                  name: 'stateA',
                                  files: [
                                      'stateA.css',
                                      'stateA.js',
                                  ],
                              ,
                          ]);
                      ,
                  ],
              ,
          )

          .state('stateB', 
              url: '/stateB',
              controller: 'StateBCtrl',
              templateUrl: 'stateB.html',
              resolve: 
                  load: [ '$ocLazyLoad', function($ocLazyLoad) 
                          return $ocLazyLoad.load([
                              
                                  name: 'stateB',
                                  files: [
                                      'stateB.css',
                                      'stateB.js',
                                  ],
                              ,
                          ]);
                      ,
                  ],
              ,
          );
  );

我还创建了一个plunkr 来演示一个工作模型。

Documentation 了解更多可能的配置选项。

希望对你有帮助!

【讨论】:

以上是关于延迟加载基于控制器命名空间约定的外部 JS/CSS 文件?的主要内容,如果未能解决你的问题,请参考以下文章

命名空间命名约定

tp3.2/thinkphp3.2引入外部类文件/.php文件总结

当顶层命名空间包含基类而内部命名空间包含子类时的 C# 命名空间和类/子类命名约定

[CompanyName] 以小写“i”开头时的命名空间命名约定

函数的 命名空间 作用域

没有中间证书的 SSL 会导致签名的 APK 不加载外部 CSS/JS 吗?