Angular中使用$uibModal弹窗无法读取更新后$scope变量问题求助
问题根因
$uibModal默认创建独立的子作用域,你给模态框指定了和父页面相同的Customer控制器,模态框打开时会重新实例化一个全新的控制器实例,和父页面的控制器完全隔离,新实例中的$scope.dataModalEdit还是初始化的空数组,父控制器的赋值不会自动同步过去。- 你已经在
resolve中定义了返回参数items,但没有在模态框控制器中注入该参数,无法拿到传递的param值。 - 你最初写的
{{{dataEdit}}}语法错误,AngularJS 插值表达式仅需两层大括号。
解决方法
方案一(推荐):通过resolve传参,单独声明模态框控制器
该方案逻辑隔离性好,避免作用域污染,适合大多数场景:
- 调整父控制器的模态框配置,新增独立的模态框控制器接收参数:
Customer.controller('Customer', function ($scope, apiREST, $uibModal) { $scope.test = 10; $scope.open = function (view, param) { let templateUrl, controller; switch (view) { case 'edit': templateUrl = 'edit.view.html'; controller = 'CustomerEditModalCtrl'; // 绑定独立的模态框控制器 break; } const modalInstance = $uibModal.open({ animation: true, templateUrl: templateUrl, controller: controller, size: '', backdrop: true, keyboard: false, resolve: { // 直接返回要传递给模态框的编辑数据 editData: function() { return param; } } }); }; $scope.action(); }); // 新增模态框专属控制器,注入resolve传递的editData Customer.controller('CustomerEditModalCtrl', function ($scope, $uibModalInstance, editData) { $scope.dataModalEdit = editData; // 可在此处新增模态框的保存、关闭等逻辑 $scope.closeModal = function () { $uibModalInstance.dismiss('cancel'); }; });
- 原视图代码无需修改,
{{dataModalEdit.name}}即可正常渲染值。
方案二:传入父作用域复用变量
如果场景简单不想拆分控制器,可以直接给模态框传入父控制器的作用域,即可直接复用父控制器的所有变量:
仅需在模态框配置中新增scope: $scope参数即可:
var modalInstance = $uibModal.open({ animation: true, templateUrl: templateUrl, controller: controller, scope: $scope, // 新增该行,传入父控制器作用域 size: '', backdrop : true, keyboard : false, resolve: { items: function() { return { param }; } } });
注意:该方案下模态框和父控制器共用作用域,变量修改会双向同步,仅适合简单场景使用。
内容的提问来源于stack exchange,提问作者Heimdall
相关产品推荐
相关产品推荐

