我有这两个指令,一个嵌套在另一个指令中:
<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;
});
上面的代码可能有些难以理解,因为它是大型应用程序的一部分,但我希望它能解答我的问题。我的目标是从指令
items
中更改指令envato
的作用域属性。由于我有一个迭代,我想知道何时完成迭代,以便在该迭代期间对附加的DOM元素执行另一个操作。例如,假设我在指令
envato
中定义了scope.swipe
,并监视其更改。在指令items
中,我将监视ng-repeat
何时完成,然后更改上述定义的作用域属性scope.swipe
。这将触发指令envato
内的更改,并且现在我将知道我可以执行我的操作。我希望我说得足够清楚,如果不清楚,我可以尝试添加更多代码或说明更具体。如何实现上述描述的内容?
编辑:我确实知道在指令
items
中使用:console.log(angular.element(element.parent()).scope());
将给出指令envato
的作用域,但我想知道是否有更好的方法。
scope.$eval('scopeValue + localValue', {localValue: 15})
。请注意,在赋值时,子作用域将其值更改,而不是父作用域。在这种情况下,您应该在父级使用一个函数来允许您更改该值(即scope.$eval('changeValue(12345)')
)。在此处查看有关作用域继承的更多信息。阅读ng-repeat文档。 - Caio Cunhaenvato
中观察count
属性:scope.$watch("count", function(old, current, s) { console.log(old, current, s); });
;那么监视器会看到变化,对吗?实际上,count
只是一个例子,我只需要将该属性从false设置为true,以便继续执行另一个操作(或任何值告诉我可以继续应用需要应用的函数,此函数需要在将模板附加到DOM /渲染后应用)。在这种情况下,使用$eval
更改的正确表达式是什么? - Rolandscope.$eval('swipe = true');
,但是这个语句只是在我的items
作用域中添加了一个swipe
属性,而没有在父作用域(即envato
作用域)中添加。 - Roland$apply()
怎么样?我读过它比$eval
更受欢迎。从你的评论中,我确实得到了一个好东西,使用scope.$last
将为我提供一个真值,如果我在最后一次迭代上(这非常有用,因为我刚刚使用了另一种方法来找出它)。但是,我无法理解“使用父级函数允许您更改值(即scope.$eval('changeValue(12345)')
)”部分,我需要做什么? - Roland$watch
,因为更改仅在子级中。关于$apply
,它在内部使用$eval
并发出$digest cycle
。如果已经在$digest
中(例如ng-click
或$watch
),则无法使用它。在父作用域中,您创建一个函数parentScope.iterate = function() { parentScope.count++; }
。在子级中,您调用$eval('iterate()')
。这样,您将迭代父级的属性。 - Caio Cunha