【问题标题】:Use UI-Bootstrap Modal with Angular-Fullstack and ES6将 UI-Bootstrap Modal 与 Angular-Fullstack 和 ES6 一起使用
【发布时间】:2016-09-15 13:10:41
【问题描述】:

我想将ui-bootsrap ModalAngularJS Fullstack Generator & ES6 一起使用,但它不起作用。 我想选择一个项目,点击“编辑”并在一个大模态中编辑项目。但我没有打开模式。

在控制台中,我收到以下错误消息:

"Error: $modal is not defined"

我的项目控制器如下所示:

'use strict';

(function() {

  class ProjectCtrl {

    constructor(Project, $modal, $log) {
      this.project = Project;
      this.projects = [];
      this.getAllProjects(Project);
      this.$modal = $modal;
      this.log = $log;
    }

    // Open a modal window to Update a single Project
    modalUpdate(size, selectedProject) {
      var modalInstance = $modal.open({
        templateUrl: 'app/project/project-edit.modal.html',
        controller: function ($scope, modalInstance, aProject) {
          $scope.project = aProject;
        },
        size: size,
        resolve: {
          aProject: function () {
            return selectedProject;
          }
        }
      });

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

angular.module('projectApp')
    .controller('ProjectCtrl', ProjectCtrl);
})();

app.js 看起来像这样:

'use strict';

angular.module('projectApp', [
  'projectApp.constants',
  'ngCookies',
  'ngResource',
  'ngSanitize',
  'ui.router',
  'ui.bootstrap' 
])
  .config(function($urlRouterProvider, $locationProvider) {
    $urlRouterProvider
      .otherwise('/');

    $locationProvider.html5Mode(true);
  });

打开 Modal 的按钮:

<button type="button" class="btn btn-default btn-xs pull-right" ng-click="ProjectCtrl.modalUpdate('lg', project)"><span aria-hidden="false"></span> Edit</button>

我的猜测是,在 ProjectCtrl 中,我必须以某种方式 $inject 'Project'、'$modal' 和 '$log',但我不知道如何以及在哪里。

【问题讨论】:

    标签: javascript angularjs ecmascript-6 angular-ui-bootstrap angular-fullstack


    【解决方案1】:

    我以另一种方式解决了 Modal 问题,因为 UI Bootstrap 似乎在 ES6 中不起作用。至少现在不会。

    我为 Angular-Fullstack 使用了模态服务 here

    这是一个带有删除模式的简单示例:

    'use strict';
    
    (function() {
    
    class AdminController {
      constructor(User, Modal) {
        // Use the User $resource to fetch all users
        this.users = User.query();
        this.modal = Modal;
      }
    
      delete(user) {
        var deleteConfirmationModal = this.modal.confirm.delete((user) => {
            user.$remove();
            this.users.splice(this.users.indexOf(user), 1);
        });
    
        deleteConfirmationModal(user.name, user);
      }
    }
    
    angular.module('sampleApp.admin')
      .controller('AdminController', AdminController);
    
    })();
    

    Modal 是这样的:

    【讨论】:

      【解决方案2】:

      您使用的是哪个版本的 ui-bootstrap?

      语法因您使用的版本而异。

      假设您使用的是 v0.13.4 或更早版本并且没有 ES6,这里的解决方案是:

      注意: 如果您使用的是比 v0.13.4 更新的版本,请将 $modal 替换为 $uibModal 并将 $modalInstance 替换为 $uibModalInstance,它应该也可以工作。


      首先,你需要做的是在命令行中写:

      yo angular-fullstack:controller MyModalName
      

      然后在 myModalName.controller.js 中输入:

      .controller('MyModalNameCtrl', function ($scope,$modal) {
      
      $scope.openModal = function () {
        var modalInstance = $modal.open({
          animation: true,
          templateUrl: 'testmodal',
          controller: 'ModalInstanceCtrl',
      
        });
      
        modalInstance.result.then(function () {}, function () {
          console.log('Modal dismissed at: ' + new Date());
        });
      };
      

      });

      然后仍然在 myModalName.controller.js 放在下面:

      //change theNameOfYourApp to your corresponding app name !
      angular.module('theNameOfYourApp').controller('ModalInstanceCtrl', function ($scope, $modalInstance) {
      
        $scope.ok = function () {
          $modalInstance.close(); 
        };
      
        $scope.cancel = function () {
          $modalInstance.dismiss('cancel');
        };
      });
      

      然后最后一步,在您的 .html 页面中您要显示模式的地方,输入:

      <!--Modal Template-->
      <div ng-controller="MyModalNameCtrl">
        <script type="text/ng-template" id="testmodal">
          <div class="modal-header">
            <h3 class="modal-title">Hello :</h3>
          </div>
          <div class="modal-body">
            <p>hey, this is the body </p>
          </div>
          <div class="modal-footer">
            <button class="btn btn-default" type="button" ng-click="ok()">OK</button>
      
            <button class="btn btn-default" type="button" ng-click="cancel()">Cancel()</button>
          </div>
        </script>
      </div>
      

      【讨论】:

      • 我昨天将我的 ui-bootstrap 更新到了最新版本。没有其他方法可以解决我已经存在的“ProjectCtrl”中的问题吗?我正在将此控制器用于 CRUD 操作,并且我想使用 Modal 来更新项目的值。但是我在 ES6 中编写了 ProjectCtrl 并且不知道如何在 ES6 中实现模态。
      • 我对 ES6 不太了解,所以在这种情况下我真的帮不上你 :/ 也许,收回我上面的例子,把我写的东西翻译成 ES6,它不应该我猜太难了。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-02-15
      • 2017-03-10
      • 1970-01-01
      • 1970-01-01
      • 2014-02-17
      • 2018-05-06
      • 2015-04-19
      相关资源
      最近更新 更多