Я ищу любой способ доступа к "родительской" области видимости в директиве. Любая комбинация области видимости, transclude, require, передачи переменных (или самой области видимости) сверху и т. Д. Я полностью готов отклониться назад, но я хочу избежать чего-то совершенно хакерского или не поддерживаемого. Например, я знаю, что мог бы сделать это прямо сейчас, взяв параметры $scope
из preLink и обойдя его $sibling
области действия, чтобы найти концептуального «родителя».
Что я действительно хочу, так это иметь возможность $watch
выражения в родительской области видимости. Если я могу сделать это, то я могу выполнить то, что я пытаюсь сделать здесь:
AngularJS - Как сделать партиал с переменными?
Важным примечанием является то, что директива должна использоваться повторно в той же родительской области. Поэтому поведение по умолчанию (scope: false) не работает для меня. Мне нужна отдельная область действия для каждого экземпляра директивы, а затем мне нужна $watch
переменная, которая находится в родительской области действия.
Пример кода стоит 1000 слов, поэтому:
app.directive('watchingMyParentScope', function() {
return {
require: /* ? */,
scope: /* ? */,
transclude: /* ? */,
controller: /* ? */,
compile: function(el,attr,trans) {
// Can I get the $parent from the transclusion function somehow?
return {
pre: function($s, $e, $a, parentControl) {
// Can I get the $parent from the parent controller?
// By setting this.$scope = $scope from within that controller?
// Can I get the $parent from the current $scope?
// Can I pass the $parent scope in as an attribute and define
// it as part of this directive's scope definition?
// What don't I understand about how directives work and
// how their scope is related to their parent?
},
post: function($s, $e, $a, parentControl) {
// Has my situation improved by the time the postLink is called?
}
}
}
};
});
источник
scope.$watch('localName3', function() { ...[?? WHAT TO DO HERE for example?] });
$parse
с=
: скрипкой .$parse
нужен только для неизолированных областей.Доступ к методу контроллера означает доступ к методу родительской области из директивы controller / link / scope.
Если директива разделяет / наследует родительскую область, тогда просто вызвать метод родительской области.
Немного больше работы требуется, если вы хотите получить доступ к методу родительской области из области действия изолированной директивы.
Существует несколько опций (может быть больше перечисленных ниже) для вызова метода родительской области действия из изолированной области действия директив или просмотра переменных родительской области ( опция №6 специально).
Обратите внимание, что я использовал
link function
в этих примерах, но вы также можете использоватьdirective controller
в зависимости от требований.Опция 1. Через литерал объекта и из директивы html шаблона
index.html
itemfilterTemplate.html
app.js
рабочий plnkr: http://plnkr.co/edit/rgKUsYGDo9O3tewL6xgr?p=preview
Вариант № 2. Через литерал объекта и из директивы link / scope
index.html
itemfilterTemplate.html
app.js
рабочий plnkr: http://plnkr.co/edit/BRvYm2SpSpBK9uxNIcTa?p=preview
Вариант № 3. Через ссылку на функцию и из директивы html шаблона
index.html
itemfilterTemplate.html
app.js
рабочий plnkr: http://plnkr.co/edit/Jo6FcYfVXCCg3vH42BIz?p=preview
Вариант № 4. Через ссылку на функцию и из директивы link / scope
index.html
itemfilterTemplate.html
app.js
рабочий plnkr: http://plnkr.co/edit/BSqx2J1yCY86IJwAnQF1?p=preview
Вариант № 5: с помощью ng-модели и двухстороннего связывания вы можете обновить родительские переменные области видимости. , Таким образом, в некоторых случаях вам может не потребоваться вызывать родительские функции области видимости.
index.html
itemfilterTemplate.html
app.js
рабочий plnkr: http://plnkr.co/edit/hNui3xgzdTnfcdzljihY?p=preview
Вариант № 6: Сквозная
$watch
и$watchCollection
двусторонняя привязка дляitems
всех вышеприведенных примеров, если элементы изменяются в родительской области, элементы в директиве также отражают изменения.Если вы хотите посмотреть другие атрибуты или объекты из родительской области, вы можете сделать это, используя
$watch
и$watchCollection
как указано нижеHTML
скрипт app.js
var app = angular.module ('plunker', []);
Вы всегда можете обратиться к документации AngularJs для подробного объяснения директив.
источник
и у вас будет такая же область (с родительским элементом)
Существует много способов доступа к родительской области видимости в зависимости от этих двух параметров: видимость и трансключ
источник
Вот трюк, который я использовал один раз: создайте директиву «dummy» для хранения родительской области и поместите ее где-нибудь за пределами желаемой директивы. Что-то вроде:
а потом
Возможно, не самое изящное решение, но оно сделало свою работу.
источник
Если вы используете классы ES6 и
ControllerAs
синтаксис , вам нужно сделать что-то немного другое.Посмотрите фрагмент ниже и обратите внимание, что
vm
этоControllerAs
значение родительского Контроллера, которое используется в родительском HTMLисточник
Перепробовав все, я наконец-то нашел решение.
Просто поместите следующее в ваш шаблон:
{{currentDirective.attr = parentDirective.attr; ''}}
Он просто записывает родительский атрибут / переменную области, к которой вы хотите получить доступ к текущей области.
Также обратите внимание
; ''
на то, что в конце оператора нужно убедиться, что в вашем шаблоне нет вывода. (Angular оценивает каждое утверждение, но выводит только последнее).Это немного глупо, но после нескольких часов проб и ошибок, оно делает свою работу.
источник