当使用ui modal时,ui router作用域中的Angular控制器不会改变
Angular controller in ui router scope does not change when working with ui modal
我混淆了在ui模态控制器的范围,当使用'控制器在ui路由器。我试图继续使用相同的控制器(CompanyCtrl)作为模态控制器,以便我可以将新创建的公司数据添加到现有的公司范围中。在openModal函数的一边,我将范围分配给一个modalInstance,这样我就可以使用这个实例来关闭或做任何我想要的模态。但是,当我单击关闭按钮时,closeModal中的modalInstance不知何故未定义。
//////// My company module and controller
var CompanyCtrl = function ($modal) {
this.modalTitle = 'Create Company';
this.openModal = function() {
this.modalInstance = $modal.open({
animation: true,
controller: 'CompanyCtrl as lsmodal',
bindToController: true,
template: '<ls-modal><ls-create-company></ls-create-company></ls-modal>'
});
};
this.closeModal = function() {
console.log(this.modalInstance); // undefined ????????
};
};
angular.module('company', []);
angular.module('company').config(function ($stateProvider) {
/* Add New States Above */
$stateProvider.state('master.company', {
url: '/company',
templateUrl: 'modules/company/company.html',
controller: 'CompanyCtrl as company'
});
})
.controller('CompanyCtrl', CompanyCtrl);
//////// ls modal html
<div class="modal-header">
<button type="button" class="close" ng-click="lsmodal.closeModal()">×</button>
<h4 class="modal-title">{{lsmodal.modalTitle}}</h4>
我的问题是
因为他们共享控制器,为什么我在openModal函数中分配给
this/scope
的一切都在closeModal中消失了。这是因为我使用CompanyCtrl作为lsmodal创建了另一个新的作用域吗?如何解决这个问题?这个设计是共用同一个控制器吗?或者为modal创建一个单独的控制器。如果创建一个分离的控制器,我如何将新创建的公司对象附加到公司列表,以便html中的公司列表也将更新。
-
是的,控制器不是单例的,所以每次你把控制器分配给一个模板,你都在有效地创建一个新的实例。我不确定这是否可以避免。这正是你看到未定义的原因。这。
在对话框控制器中打印的modalInstance变量只存在于父控制器的上下文中。 控制器/?应该吗?可以将其视为视图模型——也就是说,它们应该是视图的编程表示。如果你有不同的视图,那么有不同的控制器是有意义的。如果你需要原始控制器中存在的模态数据,你可以像这样通过解析器'传递'数据:
var modalCtrl = function($scope, $modalInstance,DataYouExpectFromParentCtrl) {
$scope.data = DataYouExpectFromParentCtrl;
$scope.ok = function () {
$modalInstance.close(/* pass anything here that the parent will receive after OK */);
};
$scope.cancel = function () {
$modalInstance.dismiss('cancel');
};
};
var CompanyCtrl = function ($modal) {
this.modalTitle = 'Create Company';
this.openModal = function() {
var modalInstance = $modal.open({
animation: true,
controller: 'ModalCtrl as lsmodal',
bindToController: true,
template: '<ls-modal><ls-create-company></ls-create-company></ls-modal>',
resolve: {
DataYouExpectFromParentCtrl: this.data;
}
});
modalInstance.result.then(function (dataFromModal) {
// handle data returned if OK
}, function () {
// handle cancellation
});
};
};
相关文章:
- 如何使用skip参数使用angular ui引导进行服务器端分页
- 混合 ui-sref 和 $state.go 在 Angular ui-router 中进行状态转换
- 如何在Angular UI网格中选择下一行
- 使用按钮的Angular UI网格过滤器
- Angular UI启动日期选择器问题
- 包括angular 1.3.0项目上的angular bootstrap ui
- 在Angular ui路由器中,如何将事件从一个视图发送到另一个视图
- 带有嵌套状态的Angular ui路由器和后退按钮
- OnsenUI、Angular和在警报对话框后刷新UI组件
- Angular UI-GRID未在页面上显示网格
- 初始化ng模型时,Angular ui选择占位符不起作用
- Ionic + Angular ui-sref not generating href
- 在日期更改后更新Angular UI引导程序日期选择器选项
- Angular ui路由器中的绝对名称
- Angular+bootstrap ui,检查当前选项卡是否已处于活动状态
- 如何在angular bootstrap ui中聚焦活动导航选项卡中的拳头输入字段
- Angular JS/UI Router:为给定状态禁用指令
- 在模态(bootstrap ui angular)中编辑现有联系人
- 使用帐户登录ui angular dons't刷新$account.currentUser
- 使用ONSEN UI + Angular上传个人资料照片