У меня есть эти две директивы, один вложенными друг в друга:доступ к родительской области внутри директивы
<envato class="container content-view-container" data-ng-cloak data-ng-hide="spinner">
<items data-ng-repeat="items in marketplaces"></items>
</envato>
И каждый из этих двух определяются как таковые:
Application.Envato.directive("envato", ["$timeout", function($timeout){
var object = {
restrict : "E",
controller : "EnvatoAPIController",
transclude : true,
replace : true,
templateUrl : "templates/envato-view.php",
link : function(scope, element, attrs, controller) {
console.log(scope);
return controller.getLatestItems().then(function(data) {
scope.marketplaces = angular.fromJson(data);
scope.count = scope.marketplaces.length;
var tst = angular.element(element).find(".thumbnails");
/* $timeout(function() { scope.swiper = new Swipe(document.getElementById('swiper-container')); }, 5000); */
scope.spinner = false;
});
}
};
return object;
}]);
Application.Envato.directive("items", function(){
var iterator = [],
object = {
require : "^envato",
restrict : "E",
transclude : false,
replace : true,
templateUrl : "templates/envato-items-view.php",
link : function(scope, element, attrs, controller) {
iterator.push(element);
if (iterator.length === scope.$parent.$parent.count) { console.log(iterator); };
}
};
return object;
});
Много кода выше, возможно, не имеет большого смысла, потому что это часть более крупного приложения, но я надеюсь, что это будет сделано для моего вопроса. Я пытаюсь изменить свойство scope директивы envato
по директиве items
. Поскольку у меня есть итерация, и я хочу знать, когда это будет сделано, я могу выполнить еще одну операцию над добавленными элементами DOM во время этой итерации.
Например, предположим, что у меня будет scope.swipe
, определяемый внутри директивы envato
, и наблюдайте за изменениями. В директиве items
, я буду смотреть, когда будет выполнен ng-repeat
, а затем изменить указанное выше свойство области видимости scope.swipe
. Это вызовет изменение внутри директивы envato
, и теперь я узнаю, что я могу выполнить свою операцию.
Надеюсь, что я достаточно ясен, если не могу попробовать иметь больше кода, или я постараюсь быть более конкретным. Как я мог достичь того, что я только что описал выше?
EDIT: Я знаю, что с помощью: console.log(angular.element(element.parent()).scope());
внутри директивы items
даст мне сферу envato
директивы, но мне было интересно, если есть лучший способ сделать это.
И могу ли я применить к нему новые значения? – Roland
Да, вы можете оценить любое [действительное угловое выражение] (http://docs.angularjs.org/guide/expression). Вы даже можете передавать локальные значения: 'scope. $ Eval ('scopeValue + localValue', {localValue: 15})'. Обратите внимание, что при настройке дочерняя область будет иметь значение изменено, а не родительское. В этом случае вы должны использовать функцию у родителя, чтобы вы могли изменить значение (т. Е. 'Scope. $ Eval ('changeValue (12345)')'). Посмотрите [здесь] (https://github.com/angular/angular.js/wiki/The-Nuances-of-Scope-Prototypal-Inheritance) для получения дополнительной информации о наследовании области. Прочитайте документы ng-repeat. –
Я вижу, поэтому, если я буду следить за свойством 'count' в родительской директиве' envato': 'scope. $ Watch (" count ", function (old, current, s) {console.log (old, current, s);}); '; часы будут видеть изменения вправо? Фактически, 'count' был всего лишь примером, я бы только установил свойство от false в true, чтобы продолжить другую операцию (или любое значение, которое говорит мне, что я могу продолжить применение функции, которая должна применяться после с шаблоном, добавленным в DOM/rendered). В этом случае было бы правильным выражением для изменения этого с помощью '$ eval'? – Roland