我遇到了在AngularJS中重写控制器的问题。

问题来了:

    function UiCoreController($scope, ...) {
        'use strict';

        angular.extend(vm, {
            validatePremium: validatePremium
    }

        function validatePremium() {
            console.log('validate premium in core controller');
            // validation logic
            vm.calculatePremium();
        }

        function calculatePremium() { ... }
    }

function UiAskController($rootScope, $scope, $controller) {
    'use strict';

    var vm = this;
    var core = $controller('UiCoreController', { $scope: $scope });

    angular.extend(this, core);

    angular.extend(vm, {
      ...
    }
    function calculatePremium() { ... }
}


当我从模板(通过validatePremium()指令)调用ng-change方法时-从UiCoreController调用它,但是更具描述性的calculatePremium()没有调用UiAskController::calculatePremium()

仅当将整个validatePremium()方法复制粘贴到UiAskController时,该方法才有效,但在我看来,它类似于代码复制。

有人能帮我用类似Java的代码实现对calculatePremium()的调用吗?

最佳答案

Javascript不像Java那样是OOP,因此没有多态性和继承。如此简短的答案是没有。仅使用控制器无法实现所需的功能。函数calculatePremium绑定到控制器作用域,并且确保您不想在控制器之间共享作用域。

您可以将此方法编写为$rootScope,但是它不是一个好习惯



我会将vm.calculatePremium()逻辑投入使用。它是制作此类东西的正确位置。

请记住,控制器的主要目的是将您的数据绑定到DOM。使用范围渲染视图。

由于Service是单例,因此您可以在服务中进行的所有数据操作都可以避免代码重复并简化代码维护

10-07 14:44