javascript - 从变量值动态设置 ng-controller

标签 javascript angularjs node.js angularjs-ng-repeat ng-controller

我正在使用 angularJs 和 nodejs 开发应用程序。将 Controller 的名称设置为主 Controller 的变量值时感到震惊。为了更好地解释它,我的 index.html 看起来像这样:

        <tbody ng-repeat="group in groups">

        <tr ng-repeat="member in group.members" >
            <td rowspan="{{group.members.length}}" ng-hide="$index>=0">
            </td>

            <td>{{member.taskName}}</td>
            <td><div class={{group.colorMe[0]}}>{{member.env}}</div>
                <button class="btn btn-info" ng-controller="member.taskName" ng-click="test( member.taskName , 'env', group.colorMe[0])">Sanity</button>
            </td>

我的主 Controller 看起来像这样定义组:

  var tasks =['task1','task2','task3','task4','task5'];

      for(i=0;i<tasks.length;i++)

    {

    var group = {
                  "id" : i+1,
                  "members" : [{
                      "taskName":tasks[i].toUpperCase(),
                      "env1":versionMap["env1"+tasks[i]],
                      "env2":versionMap["env2"+tasks[i]],
                      "env3":versionMap["env3"+tasks[i]]

                  }]
                };
              $scope.groups.push(group);
              }

现在,当我单击按钮时,我应该被定向到一个特定的 Controller ,并且这个 Controller 名称需要动态设置为 member.taskName。有人可以帮我解决这个问题吗?

最佳答案

您需要向您的服务添加一些额外的逻辑。因此它将需要新的依赖项,例如:$controller$compile$root$scope$scope .以及可选的一个$templateCache。模板也是可选的。

演示 JSFiddle

动态 Controller 服务:

var controllerTemplate = $templateCache.get(params.templateUrl); // getting inline template string

var templateScope = $rootScope.$new(true); // creating new scope for future controlelr
var templateCtrl = $controller(dynamicControllerName, { // creating controller
     $scope: templateScope // locals stuff that inject in controller           
});

var dynamicControllerElement = angular.element(controllerTemplate); // wrapping template into element

dynamicControllerElement.children().data('$ngControllerController', templateCtrl); // inject controller into element

var compiled = $compile(dynamicControllerElement)(templateScope); // compile all together

$('.container').html(compiled); // putting compiled into DOM (jQuery example) 

更具体的代码:

指令

 app.directive('dynamicControllerButton', function(dynamicControllerService){
    return {
      restrict: 'E',
      scope: {
         controllerName: '='
      },
      template: '<button class="btn btn-info">Sanity</button>', //added this comma
      link: function(scope, elem, attrs) {

           dynamicControllerService.createController(scope.controllerName, elem); // we passing also element;

    }

  }

})

服务

app.service('dynamicControllerService', function($rootScope, $controller, $compile){

     this.createController = function(dynamicControllerName, element) {

    // all that stuff in example above

      element.html(compiled); // adding compiled controller in element example ;

     }

})

HTML

    <tr ng-repeat="member in group.members" >
        <td rowspan="{{group.members.length}}" ng-hide="$index>=0">
        </td>

        <td>{{member.serviceName}}</td>
        <td><div class={{group.colorMe[0]}}>{{member.env}}</div>
            <dynamic-controller-button>  data-controller-name="dynamic_set_controller" ng-click="test( member.serviceName , 'env', group.colorMe[0])"></dynamic-controller-button>
        </td>

希望对你有帮助

关于javascript - 从变量值动态设置 ng-controller,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43672698/

相关文章:

javascript - 如何在 React 中获取自定义 Hook 以首先加载,然后使用 setInterval 每 4 秒运行一次?

javascript - AngulareJS e2e 检查列表中的每个链接

javascript - ng-repeat 仅显示 json 中的最后一项

javascript - jquery scroll防止排队

javascript - 如何使用 Django 控制循环

javascript - 如果存在则追加到列表或在 dynamoDB 中添加列表

javascript - 如何将Excel日期转换为时间戳

javascript - 执行在await Promise.all后停止

javascript - 如何使用 jQuery find 从整页 HTML 字符串中提取内容

angularjs - 模型未在指令的点击事件中更新