Ответ 1
как я могу сделать область действия этой директивы наследовать переменную из родительской области и все же иметь ее как область выделения?
Использование слова "inherit" здесь немного запутанно. Область изоляции не (прототипно) наследуется от родительской области. Angular помещает свойство $parent
в область изоляции, поэтому вы можете получить доступ к свойствам родительских областей таким образом, но лучше всего не использовать $parent
. Если вы хотите выделить область выделения, единственный способ передать значения свойств родительской области в эту область выделения - использовать =
, @
или &
. Все три будут работать (даже "&" может использоваться для передачи значений свойств через выражение для любопытных).
В области выделения (или если вы используете scope: true
), вы можете создавать новые свойства. Эти новые свойства не распространяются на родителя. Итак, если вы хотите изменить значение свойства, которое вы передали в директиву, вы можете просто скопировать его в какое-либо новое свойство в области директивы.
Вот пример использования @
, синтаксиса "однонаправленная строка". Чтобы получить (интерполированное) значение свойства родительской области (в виде строки), используйте {{}} s в HTML:
<div class="dostuff" some-var="{{interpolateThisParentScopePropertyPlease}}">
sAngular.app.directive('dostuff', ['$compile', function($compile){
return {
restrict : 'C',
scope: { someVar : '@' },
link : function(scope, element, attrs){
element.click(function(){
scope.myLocalDirectiveProperty = scope.someVar;
scope.someOtherDirectiveProperty = 'somethingelse';
var dropdownOutput = template();
var compiledOutput = $compile(dropdownOutput)(scope);
scope.$apply();
});
}
Если вы хотите передать объект в директиву, используйте синтаксис '=', а затем используйте angular.copy()
, чтобы сделать копию объекта внутри директивы.
В соответствии с запросом на комментарий:
<div class="dostuff" some-obj="parentScopeObj">
sAngular.app.directive('dostuff', ['$compile', function($compile){
return {
restrict : 'C',
scope: { someObj : '=' },
link : function(scope, element, attrs){
element.click(function(){
scope.myLocalDirectiveObjProperty = angular.copy(scope.someObj);
...
scope.$apply();
});
}