Ответ 1
Мы могли бы сделать это с помощью jQuery:
$(window).resize(function(){
alert(window.innerWidth);
$scope.$apply(function(){
//do something to update current scope based on the new innerWidth and let angular update the view.
});
});
Помните, что когда вы привязываете обработчик событий внутри областей, которые могут быть воссозданы (например, области действия ng-repeat, области действия директивы...), вы должны развязать обработчик событий при уничтожении области, Если вы этого не сделаете, каждый раз, когда область воссоздается (контроллер перезапускается), добавляется еще один обработчик, вызывающий неожиданное поведение и утечку.
В этом случае вам может понадобиться определить ваш прикрепленный обработчик:
$(window).on("resize.doResize", function (){
alert(window.innerWidth);
$scope.$apply(function(){
//do something to update current scope based on the new innerWidth and let angular update the view.
});
});
$scope.$on("$destroy",function (){
$(window).off("resize.doResize"); //remove the handler added earlier
});
В этом примере я использую пространство имен событий из jQuery. Вы можете сделать это по-другому в соответствии с вашими требованиями.
Улучшение. Если обработчик события занимает много времени, чтобы избежать проблем, которые пользователь может изменить размер окна, заставляя обработчики событий запускаться много раз, мы могли бы рассмотреть дросселирование. Если вы используете underscore, вы можете попробовать:
$(window).on("resize.doResize", _.throttle(function (){
alert(window.innerWidth);
$scope.$apply(function(){
//do something to update current scope based on the new innerWidth and let angular update the view.
});
},100));
или debouncing:
$(window).on("resize.doResize", _.debounce(function (){
alert(window.innerWidth);
$scope.$apply(function(){
//do something to update current scope based on the new innerWidth and let angular update the view.
});
},100));