【问题标题】:Ionic/AngularJS - global modal with controllerIonic/AngularJS - 带控制器的全局模式
【发布时间】:2016-12-04 06:36:21
【问题描述】:

请耐心等待 - 我是 AngularJS 新手。

我有一个表单,我想在我的应用程序的任何地方都可以使用它,我正在尝试弄清楚如何对其进行编码。我目前的尝试是将模式放入服务中,如下所示:

.service('NewObjectService', function() {
  var svc = this;

  svc.showModal = function() {
    $ionicModal.fromTemplateUrl('template.html', {
      scope: null, // what should I do here?
      animation: 'slide-in-up'
    }).then(function(modal) {
      svc.modal = modal;
      modal.show();
    });
  }
})

.controller('NewObjectController', function() {
  $scope.$on('$ionicView.enter', function() {
    console.log('NewObjectController');
    // setup new object
  })
})

然后,我可以在我的应用程序中的任何位置拨打NewObjectService.showModal() 并弹出模式。那部分正在工作。

我遇到的麻烦是我无法让我的控制器触发,所以初始化永远不会被调用并且我的新对象为空。

似乎我实际上应该从 NewObjectController 中调用模态来设置范围,但我尝试了,但我无法弄清楚如何从其他控制器中调用该控制器 - 因此是服务。

我知道我只是在做一些根本错误的事情,但我不确定它是什么。有什么帮助吗?

更新:我还尝试使用根范围广播从另一个控制器调用一个控制器:

.controller('MainCtrl', function() {
  this.showModal = function() {
    $rootScope.$broadcast('new_object:show_modal');
  }
})

.controller('NewObjectCtrl', function() {
  $rootScope.$on('new_object:show_modal', function() {
    // show modal
  })
})

我遇到的问题是在 MainCtrl 运行时尚未调用 NewObjectCtrl,因此它不会捕获广播事件。

【问题讨论】:

  • 也许this 可以提供帮助
  • 这似乎与我正在处理的问题不同。我不想共享控制器。

标签: angularjs ionic-framework


【解决方案1】:

当您声明服务时,您需要在 Angular 声明中返回自身,即 var svc = {};返回 svc;注入服务并传入作用域后,从任何控制器调用 svc.showModal。使用 $rootScope.$on (receiver) 和 $rootScope.$emit (from) 从另一个控制器调用控制器

.service('NewObjectService', function($ionicModal) {
  var svc = {};

  svc.showModal = function(_scope) {
    $ionicModal.fromTemplateUrl('template.html', {
      scope: _scope, // passing in scope from controller
      animation: 'slide-in-up'
    }).then(function(modal) {
      svc.modal = modal;
      modal.show();
    });
  }

  return svc;

})

.controller('NewObjectController', function($scope, $rootScope, NewObjectService) {
  // fires off when $rootScope.$emit('ShowModal') is called anywhere
  $rootScope.$on('ShowModal', function(data) {
    NewObjectService.showModal(data._scope);
  });
})

.controller('OtherController', function($scope, $rootScope) {
  $scope.contactOtherController = function() {
    // contact the other controller from this controller
    $rootScope.$emit("ShowModal", {scope: $scope});
  }
})

【讨论】:

  • 好的,但是当NewObjectController 被加载时,您的代码将加载模式 - 我如何从另一个控制器触发它?
  • 我编辑了代码,以便您可以使用 $rootScope.$on 和 $rootScope.$emit 在控制器之间进行通信
猜你喜欢
  • 1970-01-01
  • 2013-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-08
  • 2014-08-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多