Я строю рычание подобно UI в угловом. Я хотел бы представить его как завод (или услугу), чтобы сделать его доступным в моих контроллерах. Вызов growl.add приведет к изменению DOM, поэтому мне кажется, что у меня должна быть директива по этому поводу, а не прямое манипулирование DOM на заводе. Предположим, что наилучшим вариантом является комбинация с заводскими указателями (и, пожалуйста, исправьте меня, если это нехорошее предположение), вопрос:Как структурировать угловой коэффициент/обслуживание, которое управляет DOM
Как лучше всего установить связь между фабрикой и директивой?
В частности, как лучше всего отправлять сообщения от завод по директиве? Другие вопросы хорошо охватывают отправку информации другим способом, с обратным вызовом ontime.
См. Ниже рабочий пример. Я подозреваю, что это лучший способ, хотя ..
Для справки, я играл с другими вариантами:
A) есть директива смотреть службы, например,
$scope.$watch(function(){
growl.someFunctionThatGetsNewData()},
function(newValue){
//update scope
})
Но это означает, что someFunctionThatGetsNewData вызывается в каждом цикле переваривать, который, кажется расточительным, так как мы знаем, что данные только получает изменено на growl.add
B) отправить событие «», либо с помощью routecope, или через привязки событий в dom/window. Seen un-angleular
Поскольку ни один из этих вариантов не кажется хорошим, я использую один ниже, но он все еще чувствует себя взломанным. Функция register
означает, что директива и завод тесно связаны. Но опять же от использование перспектива они плотно связанный - один не годится ни с другим.
Похоже, что идеальным решением было бы объявить фабрику (или службу), которая включает директиву в ее декларации (и, возможно, функциональную область), чтобы она предоставляла один открытый интерфейс. Кажется нехорошо иметь два отдельных публично объявленных компонента, которые полностью зависят друг от друга и имеют жесткую связь в интерфейсах.
Работа примера - но там должен быть лучшим способом ..
vpModule.directive('vpGrowl',['$timeout', 'growl', function ($timeout, growl) {
return {
template: '<div>[[msg]]</div.',
link: function($scope, elm, attrs) {
growl.register(function(){
$scope.msg = growl.msg;
});
$scope.msg = growl.msg;
}
};
}]);
vpModule.factory('growl', ['$rootScope', '$sce', function($rootScope, $sce) {
var growl = {};
growl.msg = '';
var updateCallback = function(){};
growl.add = function(msg){
growl.msg = msg;
updateCallback();
};
growl.register = function(callback){
updateCallback = callback;
};
return growl;
}]);
спасибо. это работает. я первоначально тестировал что-то вроде этого, и он не работал - разница заключалась в том, что я привязывался к примитивному типу. например $ scope = growl.aStringValue. Но $ scope = growl.anObject работает, поэтому я думаю, что наблюдатели работают по-разному для примитивов. Если кто-нибудь может указать на угловую документацию, я бы с удовольствием прочитал ее. Хотя этот ответ является достаточным ответом на этот вопрос, мне все же хотелось бы видеть лучший способ связать директиву и службу в единое целое. – tom
Этот метод будет работать со строкой, объектом, коллекцией, что угодно. Я подозреваю, что проблема у вас была, что вы сделали что-то вроде scope.messages = growl.messages, а затем привязались к сообщениям. Это отличается от scope.growl = growl и bind to growl.messages, потому что, как я это делал, часы находятся в * службе * коллекции, тогда как, наоборот, часы находятся на копии * * коллекция, которая не обновляется. –
В качестве продолжения вопроса об архитектуре я считаю, что этот подход отделяет проблемы от углового. Служба отвечает за логические/информационные проблемы (что такое сообщение рычания, когда они истекают и т. Д.). Директива отвечает за обработку сообщений. –