javascript - 在 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库来做到这一点,也许?任何输入表示赞赏。
解决方案
推荐阅读
- python - Python3:为什么 3 个进程完成的速度不比 1 个快?
- php - PHP DomDocument - 调用 loadHTML() 时添加了新行符号
- c# - 协变表达式
> - c# - 操作现有的 CSV 文件,同时保持列的顺序。(CsvReader/CsvWriter)
- javascript - 如何将“2019 年 11 月 26 日星期二 16:00:00 GMT-0800”转换为 .net json 日期格式“\/Date(1574812800000)\/”格式?
- c - 如何递归地打印结构数组?
- sql - 当字符串以sql中的数字结尾时,删除单词之间的空格
- postgresql - 如何使 Buffalo 事务中间件提交?
- sql - 更新基于来自两个匹配表的记录的列?
- ajax - 将ajax转换为axios的基本结构?