我试图在ng-repeat中使用一个指令来工作..当它在HTML中被硬编码但在切换到ng-repeat后它的某些方面停止工作时它起作用。
<div ng-repeat="section in filterSections" filter-tray>
Test {{section.label}}
</div>
我有一个带有控制器的模块,可以发出事件:
controller: function($scope, $element) {
this.activateTray = function(trayID) {
$scope.$emit('filterTray::show', {
tray: trayID
});
};
};
我在页面上有一个指令 - 它应该从控制器接收事件。由于切换到使用ng-repeat接收事件已停止工作。它仍然是初始化的,它只是没有听取这个事件。
.directive('filterTray', function() {
return {
restrict: 'A',
require: '^filter',
link: function($scope, $element, attrs, filterNavController) {
console.log('this debug statement works');
$scope.$on('filterTray::show', function(e, data) {
console.log('this debug statement never runs');
});
}
};
})
由于添加重复,$ scope变量受到影响?也许$ on不再听正确的事了吗?任何想法/提示将不胜感激!
答案 0 :(得分:5)
是 - ngRepeat
创建新范围
不确定事件是否是正确的设计选择,但如果是,请使用broadcast
而不是发射,事件将达到指令的范围。
controller: function($scope, $element) {
this.activateTray = function(trayID) {
$scope.$broadcast('filterTray::show', {
tray: trayID
});
};
};
答案 1 :(得分:1)
创建将重用的指令(包括ngRepeat)时,最佳做法是为指令创建隔离范围。这样您就可以发送trayID
而无需使用事件。查看有关指令here的AngularJS文档中的隔离范围部分。