无法从子UI访问父控制器的方法
无法从子UI访问父控制器的方法
我有一个弹出窗口表单,其中有很多选项卡。
它是这样的:
index.js
vm.openCreateOrEditPropertyModal = function (resolveProperty) { var modalInstance = $uibModal.open({ templateUrl: '~/App/tenant/views/propertymanagement/createOrEditPropertyModal.cshtml', controller: 'tenant.views.propertymanagement.createOrEditPropertyModal as vm', resolve: { resolveProperty: function () { return resolveProperty; } } }); };
选项卡如下:
createOrEditPropertyModal.cshtml
createOrEditPropertyModal.js
(function () { appModule.controller("tenant.views.propertymanagement.createOrEditPropertyModal", [ "$scope", "resolveProperty", "localStorageService", "$uibModalInstance", function ($scope, resolveProperty, localStorageService, $uibModalInstance) { var vm = this; //关闭弹出窗口 vm.cancel = function () { $uibModalInstance.close(); }; } ]); })();
propertyForm.cshtml
propertyForm.js
(function () { appModule.controller("tenant.views.propertymanagement.propertyForm", [ "$scope", "resolveProperty", "localStorageService", function ($scope, resolveProperty, localStorageService) { var vm = this; } ]); })();
以上设置正常工作。现在我需要从子表单(即propertyForm.cshtml)中的createOrEditPropertyModal.js文件访问cancel()方法。但是它没有被触发。你能告诉我如何做吗?我已经尝试过像这样的方式ng-click="$parent.cancel()"。但它不起作用。
无法从子UI访问父控制器的方法的原因可能有以下几点:
1. `cancel`函数不在`$parent`作用域中,而是在父控制器中。解决方法之一可能是使用不同的控制器命名,以避免命名冲突。
2. 另一种解决方法是将`cancel`函数放在`createOrEditPropertyModal`的`$scope`变量中。
3. 也可以像指令一样将函数传递给模态框。
其中,第二种解决方法可能不适用,因为它可能会导致命名冲突。
以下是第二种解决方法的代码示例:
$scope.cancel = function () { $uibModalInstance.close(); };
第三种解决方法是将数据通过`bindToController`传递给指令。这是一种较为干净的方式,可以提高代码的可维护性。
以上是解决无法从子UI访问父控制器方法的几种可能原因和解决方法。对于数据的共享,可以考虑使用指令来传递数据,以提高代码的可读性和可维护性。
问题:无法从子UI访问父控制器的方法
原因:问题出现的原因是在子表单中,可以直接使用vm.cancel()
,因为已经使用了controllerAs模式。但在这种情况下,由于两个控制器别名都是vm
,它指的是当前子控制器的上下文。更改任一控制器别名的名称将使其正常工作。
解决方法:解决此问题的最佳方法是更改控制器别名的名称。控制器别名应根据它们的名称来选择,以便您可以假装它是哪个控制器。
此外,您也可以使用$parent.vm.cancel()
来调用父控制器的方法,但不建议在视图中使用$parent
,因为这是不好的做法。
如果您不想在代码中进行更改,可以将视图中的控制器别名更改为不同的名称。您只需要更改视图绑定,而不需要更改控制器代码。控制器中的var vm = this;
只是一个变量名,它保存了this
的引用。
希望我回答的满意。