Наблюдатели оценивают свое выражение наблюдения только при наличии пользовательских событий или событий инфраструктуры, таких как данные, поступающие с сервера. То, что вы называете «спящим», является нормальным поведением для AngularJS фреймворка.
Вместо использования наблюдателя используйте $ форматеры и $ viewChangeListeners конвейеры:
app.directive('autoResize', function($timeout) {
return {
restrict: 'A',
require: 'ngModel',
link: function autoResizeLink(scope, element, attrs, ngModel) {
ngModel.$formatters.push(function(data) {
$timeout(resize);
return data;
});
ngModel.$viewChangeListeners.push(function() {
$timeout(resize);
});
function resize() {
console.log("resize");
element.css({ 'height': 'auto', 'overflow-y': 'hidden' });
element.css('height', element[0].scrollHeight + 'px');
}
}
}
});
ngModelController вызывает функции $ formatters , когда получает новые значения модели из каркаса. Он вызывает $ viewChangeListeners , когда получает новые значения от пользователя.
THE DEMO
angular.module('app',[])
.controller('mainCtrl', function($timeout) {
var vm = this;
vm.tab = 1;
//fake async call
$timeout(function() {
console.log("data");
vm.text = 'fsafsafsafasfsa \r fsafsafsafasfsa \r fsafsafsafasfsa \r fsafsafsafasfsa \r fsafsafsafasfsa \r fsafsafsafasfsa \r fsafsafsafasfsa \r fsafsafsafasfsa \r fsafsafsafasfsa \r fsafsafsafasfsa \r fsafsafsafasfsa \r fsafsafsafasfsa \r fsafsafsafasfsa \r ';
}, 1500);
})
.directive('autoResize', function($timeout) {
return {
restrict: 'A',
require: 'ngModel',
link: function autoResizeLink(scope, element, attrs, ngModel) {
ngModel.$formatters.push(function(data) {
$timeout(resize);
return data;
});
ngModel.$viewChangeListeners.push(function() {
$timeout(resize);
});
function resize() {
console.log("resize");
element.css({ 'height': 'auto', 'overflow-y': 'hidden' });
element.css('height', element[0].scrollHeight + 'px');
}
}
}
});
a {
text-decoration: underline;
color: blue;
cursor: pointer;
}
<html ng-app="app">
<head>
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.7.5/angular.min.js"></script>
</head>
<body>
<div ng-controller="mainCtrl as vm">
<a ng-click="vm.tab = 1">Tab 1</a>
<a ng-click="vm.tab = 2">Tab 2</a>
<div ng-if="vm.tab === 2">
<textarea auto-resize ng-model="vm.text"></textarea>
</div>
</div>
</body>
</html>