首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >以角度1.6编程加载组件

以角度1.6编程加载组件
EN

Stack Overflow用户
提问于 2018-04-04 10:49:27
回答 2查看 643关注 0票数 0

我有一个AngularJS 1.6应用程序,其中有一个小部件部分。

小部件部分是一个带有3个小部件的行,最终用户可以自己配置。他给出了所有可用小部件的列表,他可以选择放置的位置和位置。

每个部件都是一个初始化的组件,如下所示:

代码语言:javascript
复制
(
  function(angular) {

    function Module1Controller() {
      var vm = this;

      // other stuff here
    }

    angular.module("app")
      .component(
        "module1", {
          controller: Module1Controller,
          templateUrl: 'module1.html'
        }  
      );
  }
)(angular)

现在,由于用户可以选择在特定位置呈现哪个小部件,所以这些数据来自webservice。

根据从WS收到的数据,我需要能够“激活”一个组件和“停用”所有其他组件。

我的第一个想法是这样做:

主计长:

代码语言:javascript
复制
(
  function(angular) {

    function ModulesController() {
      var vm = this;

      vm.firstModule = 1;
      vm.secondModule = 1;
      vm.thirdModule = 1;

      vm.availableModules = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
    }

    angular.module("app")
      .controller(
        "ModulesController", 
        [
          ModulesController
        ]
      );
  }
)(angular)

查看:

代码语言:javascript
复制
<div class="container-fluid" ng-controller="ModulesController as c">
    <div class="row">
        <div class="col-xs-4"> <!-- third widget area -->
            <module-1 ng-if="c.firstModule == 1"></module-1>
            <module-2 ng-if="c.firstModule == 2"></module-2>
            <module-3 ng-if="c.firstModule == 3"></module-3>
            <module-4 ng-if="c.firstModule == 4"></module-4>
            <module-5 ng-if="c.firstModule == 5"></module-5>
            <module-6 ng-if="c.firstModule == 6"></module-6>
            <module-7 ng-if="c.firstModule == 7"></module-7>
            <module-8 ng-if="c.firstModule == 8"></module-8>
            <module-9 ng-if="c.firstModule == 9"></module-9>
            <module-10 ng-if="c.firstModule == 10"></module-10>
        </div>
        <div class="col-xs-4"> <!-- third widget area -->
            <module-1 ng-if="c.secondModule == 1"></module-1>
            <module-2 ng-if="c.secondModule == 2"></module-2>
            <module-3 ng-if="c.secondModule == 3"></module-3>
            <module-4 ng-if="c.secondModule == 4"></module-4>
            <module-5 ng-if="c.secondModule == 5"></module-5>
            <module-6 ng-if="c.secondModule == 6"></module-6>
            <module-7 ng-if="c.secondModule == 7"></module-7>
            <module-8 ng-if="c.secondModule == 8"></module-8>
            <module-9 ng-if="c.secondModule == 9"></module-9>
            <module-10 ng-if="c.secondModule == 10"></module-10>
        </div>
        <div class="col-xs-4"> <!-- third widget area -->
            <module-1 ng-if="c.thirdModule == 1"></module-1>
            <module-2 ng-if="c.thirdModule == 2"></module-2>
            <module-3 ng-if="c.thirdModule == 3"></module-3>
            <module-4 ng-if="c.thirdModule == 4"></module-4>
            <module-5 ng-if="c.thirdModule == 5"></module-5>
            <module-6 ng-if="c.thirdModule == 6"></module-6>
            <module-7 ng-if="c.thirdModule == 7"></module-7>
            <module-8 ng-if="c.thirdModule == 8"></module-8>
            <module-9 ng-if="c.thirdModule == 9"></module-9>
            <module-10 ng-if="c.thirdModule == 10"></module-10>
        </div>
    </div>
</div>

这很管用,但我觉得这样做是错误的。如果我有200个部件呢?我必须编写<module-N ng-if="c.firstModule == N"></module-N> 200次(x3小部件区域),这显然不是解决问题的好方法。

我还想使用ng-include,但据我所知,它只适用于包含模板,我也需要相应的控制器来加载。

下面是一个柱塞,展示了我正在努力实现的目标:https://plnkr.co/edit/uO8SUcmNMOGHcPjc1lWs?p=preview

如您所见,当您更改组合体的值时,相应的模块将被替换。

问题是:是否有一种方法可以根据AngularJS 1.6中的某个控制器字段激活特定组件,而不必声明所有组件并使用ng-if

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-04-04 13:10:25

正如我在注释部分中建议的那样,您可以使用module-slot指令并将模块作为一种模型输入,并在内部解析所需模块的加载和编译。

此解决方案使用ocLazyLoad,但如果需要,可以使用其他加载程序。

我用ocLazyLoading做了一个解决方案

因此,与其使用ng-if声明所有模块并控制其可见性,不如只使用以下一个指令:

代码语言:javascript
复制
<div class="row">
    <div class="col-xs-4">
      <module-slot module="c.firstModule"></module-slot>
    </div>
    <div class="col-xs-4">
      <module-slot module="c.secondModule"></module-slot>
    </div>
    <div class="col-xs-4">
      <module-slot module="c.thirdModule"></module-slot>
    </div>
  </div>

指令:

代码语言:javascript
复制
angular.module("app")
    .directive('moduleSlot', function($ocLazyLoad, $compile) {
      return {
        restrict: 'E',
        scope: {
          module: '='
        },
        link: function(scope, element, attrs) {
          // watch the module change
          scope.$watch('module', function() {
            // load the module
            $ocLazyLoad.load("module" + scope.module + ".js").then(function() {
              // compiles the new component inside the slot
              element.html("<module-" + scope.module + "></module-" + scope.module + ">");
              $compile(element.contents())(scope);

            }, function(e) {
              console.log('errr');
              console.error(e);
            })
          });
        }
      }
    });

参考文献 OcLazyLoad文档 来自ocLazyLoad存储库的简单示例 $compile服务文档

票数 1
EN

Stack Overflow用户

发布于 2018-04-04 12:54:12

这里是显示解决方案的柱塞。关键是创建一个指令来动态地关联模板和控制器。

代码语言:javascript
复制
app.directive("module", ['$compile', '$http', '$controller', '$templateCache', function ($compile, $http, $controller, $templateCache) {
    return {
        restrict: 'E',
        replace: true,
        scope: {
            model: '='
        },
        link: function (scope, element, attrs) {
            scope.$watch("model", function (newValue, oldValue, scope) {
                if (newValue) {
                    var template = scope.model.id + ".html";
                    $http.get(template, { cache: $templateCache }).then(function (result) {
                        element.html(result.data);
                        element.children().data('$ngControllerController', $controller(scope.model.id + "Ctrl", { $scope: scope }));
                        $compile(element.contents())(scope);
                    });
                }
            });
        }
    };
}]);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49649104

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档