javascript - $watch fires only on first update of window.innerWidth -
i'm trying setup app watch window.innerwidth
property , add property $scope
based on width. works first time, not on resize after that. $digest method not being called? if why not?
module
//initialize angular module include route dependencies var app = angular.module("selfservice", ['ngroute']); app.config(function ($routeprovider) { $routeprovider .when('/', { templateurl:"partials/login.html", controller:"login" }); });
controller
app.controller("login", ['$scope', function ($scope) { $scope.$watch( function () { return window.innerwidth; }, function (newval, oldval) { if (newval < 700) { $scope.classexpand = 'expand'; } else { $scope.classexpand = ''; } console.log(newval, oldval); }); }]);
view
<div class="small-12 column"> <a href="/portal" class="button radius large {{classexpand}}">sign in</a> </div>
this works first time, if refresh screen after resizing it, expand class applied, when resize it, nothing happens, console.log function doesn't fire
resizing window doesn't cause angular re-run $digest
loop, window.innerwidth
's value checked when else causes it.
you should instead use directive (ie. don't work in controller), binding window.onresize
event:
.directive('watchresize', function(){ return { restrict: 'a', link: function(scope, elem, attr) { angular.element(window).on('resize', function(){ scope.$apply(function(){ scope.classexpand = (window.innerwidth < 700) ? 'expand' : ''; }); }); } } });
in case, call scope.$apply
. causes $digest loop run following event, outside of angular context.
you can use directive decorate element on same scope variable you're changing:
<div watch-resize> {{ classexpand }} </div>
demo (best viewed full-screen)
Comments
Post a Comment