У меня есть директива, которая должна выполнять некоторые манипуляции с DOM на основе результата служебного вызова в контроллере. После такого подход я в настоящее время следующий:Лучший подход для запуска директивы от контроллера
1) Создание объекта запуска в каждой области контроллера, соответствующий каждую директиву в виде - делать Dóm манипуляции при необходимости
2) Создание директивы и сделать манипуляции DOM на основе значения, установленного контроллером;
app.directive("myDirective", function() {
return {
restrict: 'A',
link: function (scope, element, attrs) {
attrs.$observe('myDirective', function (value) {
if (value === "true") {
$(element).text("Scrolled to####" + $(element).data("scroll"));
}
});
}
};
});
3) Из соответствующего метода контроллера установите значение true
, чтобы вызвать функциональные директивы
app.controller("controller1", ["$scope", function ($scope) {
$scope.trigger1 = false;
$scope.triggerDirective1 = function() {
$scope.trigger1 = true;
};
$scope.trigger2 = false;
$scope.triggerDirective2 = function() {
$scope.trigger2 = true;
};
}]);
<div id="c1" ng-controller="controller1">Controller 1
<br>List 1
<div my-directive="{{trigger1}}" data-scroll="20"></div>List 2
<div my-directive="{{trigger2}}" data-scroll="30"></div>
<button ng-click="triggerDirective1()">Trigger Directive 1</button>
<button ng-click="triggerDirective2()">Trigger Directive 2</button>
</div>
Полный код здесь - http://jsfiddle.net/qec35dq4/
Я считаю этот подход не так хорошо из-за следующая причина:
1) Будет указано несколько элементов с директивой, прилагаемой
2) Каждый триггер Директивы является независимым. В любое время в действии будет действовать только одна директива. В зависимости от количества директив, я должен отслеживать все триггеры в соответствующем контроллере.
Есть ли лучший способ решить эту проблему, так что можно избежать зависимости от отслеживания этого объекта области триггера в контроллере? Я думал об использовании $broadcast/$emit,$on
. Но не думайте, что это будет хорошее решение. Пожалуйста, дайте мне знать ваши мысли.
Заранее спасибо за любую помощь
EDIT:
Новая скрипка - http://jsfiddle.net/86pk8LtL/
изменил пример немного, чтобы отразить больше на то, что я пытаюсь достичь - Там будет несколько списков на страница, на которую будет применена эта директива. Основываясь на некоторой логике из фонового, некоторые элементы должны быть выбраны в списке. После выбора элементов список следует прокручивать так, чтобы отображался первый выбранный элемент (в примере я жестко кодирую прокрутку с использованием атрибутов данных. Но в действительности директива будет выполнять расчет). Цель этой директивы - просто для обработки части «прокрутки для просмотра», поэтому я скептически отношусь к тому, чтобы сохранить для нее свойство scope. Обратите внимание, что текущий подход работает нормально. Просто хочу посмотреть, есть ли какой-нибудь лучший подход к этому.
Я вижу, что вы обновляете некоторые 'result' элемент с текстом принятого в' msg' наряду с директивой. Является ли этот текст статическим для этого триггера? – Arkantos
Пожалуйста, игнорируйте логику внутри директивы. Это просто указывает на то, что директива будет выполнять некоторые манипуляции с DOM при срабатывании. – user700284
Поскольку в любой момент времени активен только один триггер, правильно ли предположить, что другие divs с разными триггерами не будут отображаться? – Arkantos