У меня есть средство визуализации дерева, которое отображает интерактивные узлы.Вот фрагмент такого взаимодействия:
<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, возможно?Любой вклад приветствуется.