首页 > 解决方案 > 在 angularjs 控制器中重用功能

问题描述

我有一个显示交互式节点的树渲染器。这是一个这样的互动:

<div class="col-sm-10 pull-left box-content" ng-click="loadEdit(node)">
    <div data-ng-if="!showEdit(node)" data-ng-include="formTemplates.display"></div>
    <div data-ng-if="showEdit(node)" data-ng-include="formTemplates.edit"></div>
</div>

功能showEdit(node)loadEdit(node)由控制器定义。我现在需要有几个具有不同逻辑的页面——我想要不同的控制器,每个控制器都有自己的showEdit(node)和其他一些专门的功能,但我想重用该loadEdit(node)功能和许多其他功能,因为它们绝对是常见的功能。

这是前面提到的loadEdit(node)

$scope.loadEdit = function(node) {
    if ($scope.selectedNode != undefined) {
        $scope.selectedNode.showEdit = false
    }
    node.showEdit = true;
    $scope.selectedNode = node;
}

重用功能的常见答案是创建一个服务,所以我打算传递$scope给一个服务,但是有些人说你不应该$scope在服务中修改(如果有人详细说明为什么我不应该这样做,我会很高兴)。此外,所有这些函数都非常浅,添加一层间接层并编写一堆这样的定义$scope.loadEdit = function(node) {return service.loadEdit(node, $scope.selectedNode);}甚至都无法解决问题——如果我还想修改另一个变量,我必须将它添加到每个控制器使用这个服务函数(而且 javascript 不关心传递的参数数量的事实使得这样的任务很容易忘记)

也许有某种方法可以将这些常用功能打包到一个对象中,然后像这样将它们添加到每个控制器中?不过,我不知道如何将其分发给object控制器:

angular.extend({}, FooCtrl, commonFunctionsObject);
angular.extend({}, BarCtrl, commonFunctionsObject);
angular.extend({}, BazCtrl, commonFunctionsObject);
...

你可以用一个javascript库来做到这一点,也许?任何输入表示赞赏。

标签: javascriptangularjs

解决方案


推荐阅读