我有一个显示交互式节点的树渲染器。这是这种互动的一部分:
<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
传递给服务,但是a few people said则不应在服务中修改$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库来做到这一点吗?任何输入表示赞赏。