поэтому у меня есть два настраиваемых фильтра для одного и того же элемента, каждый из которых имеет общую область видимости. Я хочу, чтобы вторая директива читала текст элемента, но дело в том, что текст элемента генерируется первой директивой.
app.directive('newEl', function($compile) {
return {
link: function($scope, element) {
console.log("link element : ", element.text())
}, controller: function($scope, $element) {
console.log("controller text ",$element.text())
}
}
});
Вы можете попробовать использовать $timeout
, чтобы убедиться, что выражение тайм-аута запускается после цикла дайджеста, и данные привязаны к DOM. Поскольку у вас есть ng-repeat
на том же элементе, вы можете убедиться, что элемент отображается только после того, как у вас есть данные, привязанные к нему.
$timeout(function(){
console.log("link element : ", element.text(), $scope.item)
}, 0, false); //set false if you dont want to trigger a digest
Но странно это делать, но вместо этого вы можете использовать выделенную ограниченную директиву и привязать значение item
туда с помощью двусторонней привязки.
В настройках вашей директивы:
{
scope:{item:'='}
},
и получить доступ к нему как $scope.item
в вашей директиве. Вы также можете использовать controllerAs
и bindToController
и получить item
как свойство экземпляра контроллера с этим. Избегайте доступа к $element
в вашем контроллере, и вы можете использовать эту технику. Изолированный объем позволяет создавать автономный компонент без жесткой связи с потребителем.
Или так же просто, как установить его как атрибут для edit-text
т.е.
<td ... edit-text="item" ng-repeat="item in items">{{item}}</td>
и в вашей директиве:
var item = $scope.$eval(attrs.editText);
Кроме того, поскольку ваша директива не создает область видимости, вы также можете получить доступ к ней как $scope.item
но не рекомендуется, так как она недостаточно $scope.item
и есть некоторые предположения относительно родителя.
angular.module('app', []).run(function($timeout, $rootScope) {
$timeout(function() {
$rootScope.items = [1, 2, 3, 4, 5, 6, 7];
}, 2000);
}).directive('editText', function($compile, $timeout) {
return {
link: function($scope, element, attrs) {
console.log($scope.$eval(attrs.editText), $scope.item);
$timeout(function() {
console.log("link element : ", element.text())
});
},
controller: function($scope) {
}
}
});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.0/angular.min.js"></script>
<div ng-app="app">
<div edit-text="item" ng-repeat="item in items">{{item}}</div>
</div>
В первую очередь вы можете попытаться использовать angular.element.ready. Второй - postLink.