До сих пор я разрабатывал виджеты в javascript без AngularJS. Подход всегда один и тот же: виджет предоставляет API, который позволяет клиентам изменять его из любой части приложения. Этот подход не изменился, но теперь мне нужно использовать AngularJS. У меня есть хотя в следующем решении, и я хотел бы знать ваши варианты:
angular.module("app", ["myCustomWidget"])
.controller("MainCtrl", ["$scope", "myCustomWidgetService", function($scope, myCustomWidgetService) {
$scope.myCustomWidgetService = myCustomWidgetService;
$scope.changeMyCustomWidget = function() {
$scope.myCustomWidgetService.message = "This message was written by MainCtrl";
}
}]);
/**
WIDGET
*/
angular.module("myCustomWidget", [])
.factory("myCustomWidgetService", function() {
var myCustomWidgetService = {};
myCustomWidgetService.message = "This is the default message inside the Service";
return myCustomWidgetService;
})
.directive("myCustomWidgetDirective", [function() {
return {
bindToController: true,
controllerAs: "$ctrl", // I dont know where it is used but angular fails if it is not present -> https://docs.angularjs.org/error/$compile/noident
controller: "myCustomWidgetCtrl",
scope: {},
template: '<button ng-click="changeMyCustomWidget()" type="button" name="button">Click to change from directive</button><p>{{myCustomWidgetService.message}}</p>'
}
}])
.controller("myCustomWidgetCtrl", ["$scope", "myCustomWidgetService", function($scope, myCustomWidgetService) {
$scope.myCustomWidgetService = myCustomWidgetService; //Use the Service as a part of the scope
$scope.changeMyCustomWidget = function() {
$scope.myCustomWidgetService.message = "This message was written by myCustomWidgetCtrl";
}
}]);
http://plnkr.co/edit/L58WpCkGyYionGfoeewd
Как вы думаете? это хорошая идея использовать Сервис как часть директивного контроллера?
Вы должны вводить услуги в контроллеры. Их целая цель в жизни - обрабатывать данные для контроллеров, которые являются средними менеджерами большинства приложений MVC.
Ваш вариант использования является одним из самых распространенных; у вас есть ваш контроллер, подойти к вашему сервису и пойти: "Эй, пожалуйста, покажите это сообщение для меня". Затем еще один контроллер поднимается и просит службу показать другое сообщение. И так далее.
Возможно, у вас также есть контроллер, который подходит к сервису - возможно, с пальто и флешкой, - и с хриплым шепотом пойдёт: "Эй, пожалуйста, держите эти данные для меня. У меня есть друг, Нет, все круто и на уровне ". И служба, которая имела это, случается много раз в жизни, точно знает протокол для этого. Поместите данные на эту полку; переверните этот свет; противостоять желанию alert(cops)
. Позже, другой контроллер, также носивший пальто и флешку, но на этот раз он бежевый, а не черный, поднимается, берет данные, кивает, а затем исчезает в ночи.
В обоих случаях служба ничего не знает о том, как и почему она ничего не делает; что задача контроллера. Точно так же контроллер не знает, как и почему что-либо делается, когда он отрывает свою задачу; он просто ожидает, что все будет работать.
Надеюсь, это поможет.