无法从子UI访问父控制器的方法

18 浏览
0 Comments

无法从子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()"。但它不起作用。

0
0 Comments

无法从子UI访问父控制器的方法的原因可能有以下几点:

1. `cancel`函数不在`$parent`作用域中,而是在父控制器中。解决方法之一可能是使用不同的控制器命名,以避免命名冲突。

2. 另一种解决方法是将`cancel`函数放在`createOrEditPropertyModal`的`$scope`变量中。

3. 也可以像指令一样将函数传递给模态框。

其中,第二种解决方法可能不适用,因为它可能会导致命名冲突。

以下是第二种解决方法的代码示例:

$scope.cancel = function () {
    $uibModalInstance.close();
};

第三种解决方法是将数据通过`bindToController`传递给指令。这是一种较为干净的方式,可以提高代码的可维护性。

以上是解决无法从子UI访问父控制器方法的几种可能原因和解决方法。对于数据的共享,可以考虑使用指令来传递数据,以提高代码的可读性和可维护性。

0
0 Comments

问题:无法从子UI访问父控制器的方法

原因:问题出现的原因是在子表单中,可以直接使用vm.cancel(),因为已经使用了controllerAs模式。但在这种情况下,由于两个控制器别名都是vm,它指的是当前子控制器的上下文。更改任一控制器别名的名称将使其正常工作。

解决方法:解决此问题的最佳方法是更改控制器别名的名称。控制器别名应根据它们的名称来选择,以便您可以假装它是哪个控制器。

此外,您也可以使用$parent.vm.cancel()来调用父控制器的方法,但不建议在视图中使用$parent,因为这是不好的做法。

如果您不想在代码中进行更改,可以将视图中的控制器别名更改为不同的名称。您只需要更改视图绑定,而不需要更改控制器代码。控制器中的var vm = this;只是一个变量名,它保存了this的引用。

希望我回答的满意。

0