【问题标题】:The correct way to inject an angular controller dependency inside an angular.ui modal在 angular.ui 模态中注入角度控制器依赖项的正确方法
【发布时间】:2013-10-29 12:23:49
【问题描述】:

以下 angular.ui Modal example 显示 modalInstance 调用 ModalIntanceCtrl,后者随后被创建为函数:

var ModalDemoCtrl = function ($scope, $modal, $log) {

  $scope.items = ['item1', 'item2', 'item3'];

  $scope.open = function () {

    var modalInstance = $modal.open({
      templateUrl: 'myModalContent.html',
      controller: ModalInstanceCtrl,
      resolve: {
        items: function () {
          return $scope.items;
        }
      }
    });

    modalInstance.result.then(function (selectedItem) {
      $scope.selected = selectedItem;
    }, function () {
      $log.info('Modal dismissed at: ' + new Date());
    });
  };
};

var ModalInstanceCtrl = function ($scope, $modalInstance, items) {

  $scope.items = items;
  $scope.selected = {
    item: $scope.items[0]
  };

  $scope.ok = function () {
    $modalInstance.close($scope.selected.item);
  };

  $scope.cancel = function () {
    $modalInstance.dismiss('cancel');
  };
};

我有 2 个问题/问题:

  1. 文档建议以另一种方式创建控制器(由于缩小问题),例如:

    myApp.controller('GreetingCtrl', ['$scope', function($scope) { $scope.greeting = 'Hola!'; }]);

但是如果我这样创建控制器,我怎么能将它注入到modalInstance中呢?

  1. 我在这里调用的控制器不是模态实例控制器,而是我的全局loginCtrl,这是个问题吗?我应该以某种方式子类化 loginCtrl 还是从 ModalInstanceCtrl 调用它?如果是这样 - 究竟是怎样的?

我很高兴得到有关这方面的指导和澄清。 谢谢!

【问题讨论】:

    标签: angularjs angularjs-scope


    【解决方案1】:

    您的问题不是很清楚,但是如果您使用模块API声明控制器,那么您可以将控制器作为字符串提供给模态服务

    myApp.controller('ModalInstanceCtrl', ['$scope', function($scope) { $scope.greeting = 'Hola!'; }]);
    

    controller: 'ModalInstanceCtrl',

    如果您想在模态服务中使用loginCtrl,也可以这样做。

    【讨论】:

    • 如果您在模态选项中有resolve: { someVariableToResolve : function () {} },您需要将该变量实际放入['$scope', 'someVariableToResolve', function ($scope, someVariableToResolve){}],仅供参考
    • 我有一个工厂“Myservice”,它使用一个发出 ajax 请求的函数。如何在 ModalInstanceCtrl 中使用这个工厂函数。除此之外,我还有一些变量要解决。如下所示。当前代码 app.controller('ModalInstanceCtrl', function ($scope, $uibModalInstance,ointmentId, locations){ });期待 app.controller('ModalInstanceCtrl',['$scope','$uibModalInstance','Myservice', function ($scope, $uibModalInstance, id, items){ }]);
    【解决方案2】:

    我为像我这样喜欢看例子的人创建了这个plunker。它展示了如何在不污染全局命名空间的情况下创建模式。希望对您有所帮助。

    根据bummi 下面的评论编辑以包含代码示例

    index.html

    <html ng-app="app">
      <head>
        <script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.2.8/angular.js"></script>
        <script src="http://angular-ui.github.io/bootstrap/ui-bootstrap-tpls-0.10.0.js">    </script>
    <script src="app.js"></script>
        <link href="//netdna.bootstrapcdn.com/bootstrap/3.0.3/css/bootstrap.min.css"     rel="stylesheet">
      </head>
      <body>
    
    <div ng-controller="appController">
        <script type="text/ng-template" id="myModalContent.html">
        <div class="modal-header">
            <h3>I'm a modal!</h3>
        </div>
        <div class="modal-body">
            <span>Message:{{message}}</span>
            <ul>
                <li ng-repeat="item in items">
                    <a ng-click="selected.item = item">{{ item }}</a>
                </li>
            </ul>
            Selected: <b>{{ selected.item }}</b>
        </div>
        <div class="modal-footer">
            <button class="btn btn-primary" ng-click="ok()">OK</button>
            <button class="btn btn-warning" ng-click="cancel()">Cancel</button>
        </div>
    </script>
    
    <button class="btn btn-default" ng-click="showModal()">Open me!</button>
    <div ng-show="selected">Selection from a modal: {{ selected }}</div>
    </div>
      </body>
    </html>
    

    app.js

    angular.module('app', ['ui.bootstrap']).
    service('DataService', ['$rootScope',
      function($rootScope) {
        this.data = {};
        this.data.message = 'This is a message from a service';
        this.data.items = ['item1', 'item2', 'item3'];
      }
    ]).
    controller('myModal', ['$scope', '$modalInstance', 'DataService',
      function($scope, $modalInstance, dataService) {
        $scope.data = dataService.data;
        $scope.message = dataService.data.message;
        $scope.items = dataService.data.items;
    
        $scope.selected = {
          item: $scope.items[0]
        };
    
        $scope.ok = function() {
          $modalInstance.close($scope.selected.item);
        };
    
        $scope.cancel = function() {
          $modalInstance.dismiss('cancel');
        };
    
      }
    ]).
    controller('appController', ['$scope', '$modal', '$log', 'DataService',
      function($scope, $modal, $log, dataService) {
    
        $scope.data = dataService.data;
    
        $scope.showModal = function() {
          var modalInstance = $modal.open({
            templateUrl: 'myModalContent.html',
            controller: 'myModal'
          });
    
          modalInstance.result.then(function(selectedItem) {
            $scope.selected = selectedItem;
          }, function() {
            $log.info('Modal dismissed at: ' + new Date());
          });
    
        };
    
      }
    ]);
    

    【讨论】:

    • 虽然此链接可能会回答问题,但最好包含答案的基本部分here 并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能会失效。
    • 很好的例子!这对我帮助很大!
    【解决方案3】:

    有一个类似的问题并声明了模态控制器而不将其添加到模块中,如下所示:

    var ModalInstanceCtrl = ['$scope', '$modalInstance', 'items', function ($scope, $modalInstance, items) { ... }
    

    无需其他更改,此语法也适用于缩小。

    【讨论】:

      【解决方案4】:

      执行此操作的简单方法是使用 $inject:

      // 注入具有以下依赖项的控制器 ModalInstanceCtrl.$inject = ['$scope', '$modalInstance', 'items'];

      将控制器方法更改为命名函数:

      函数 ModalInstanceCtrl($scope, $modalInstance, items) { $scope.items = 项目; $scope.selected = { 项目:$scope.items[0] }; $scope.ok = 函数 () { $modalInstance.close($scope.selected.item); }; $scope.cancel = 函数 () { $modalInstance.dismiss('取消'); }; };

      我已经写了一篇关于这个主题的博客文章,其中包括如何为使用 $inject 的指令编写测试:

      transitioning-to-angular-2-0-part-2

      【讨论】:

        猜你喜欢
        • 2016-09-15
        • 1970-01-01
        • 2020-01-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多