2016-06-21 2 views
-1

Я пытаюсь установить переменную scope для innerWidth окна браузера, используя следующий код. Он работает при просмотре в консоли, но функция не обновляет переменную $ scope. Зачем?

angular.element($window).bind('resize', function() { 
    console.log('resize', $window.innerWidth); // I can see change here 
    $scope.window_width = $window.innnerWidth; // no change here 
}); 
+0

Что говорит 'console.log ($ scope.window_width)' say? –

ответ

2

Вы что-то с jQlite, которая живет за пределами Угловая связывания, поэтому следует вручную для вызова цикла $digest здесь, в противном случае Угловые не знают, что есть изменения.

angular.element($window).bind('resize', function() { 
    console.log('resize', $window.innerWidth); 
    $scope.window_width = $window.innerWidth; 
    $scope.$evalAsync(); 
}); 

$scope.$evalAsync() будет вызывать цикл дайджеста с большей вероятностью стрельбы внутри одного Js события тик затем $timeout (подробнее here)

+0

Это неправильно. Вам не нужно применять при обновлении переменной области видимости –

+0

Вы должны, когда вы делаете это из jQuery/jQLite –

+0

Нет такой функции, как Async() – MFB

-1

Попробуйте это:

$scope.$apply(function() { $scope.window_width = $window.innnerWidth; }) 

привязывается событие DOM, так должно заставить угловую переварить фазы, в

+0

Это неправильно. Вам не нужно применять при обновлении переменной области видимости –

+0

Прочитать угловую документацию ... Он привязывается к событию вне фазы дайджест. Чтобы изменить угловое обнаружение, вы должны вызвать фазу дайджеста – Silvinus

+0

Я помещаю это в функцию связывания, правильно? Кажется, не работает – MFB

3

вы сделали глупая ошибка, может быть, когда вы набрав вопрос ,

$scope.window_width = $window.innnerWidth; //innnerWidth should be innerWidth 

и после обновления переменной области, которую нужно запустить цикл дайджеста вручную, вызвав $scope.$digest();, потому что изменение размера что-то происходит за пределами углового, поэтому мы должны сказать угловатых есть что-то обновить в объеме.

что еще мы можем использовать вместо $digest()?

  1. вы можете завернутый код в $timeout будет инициировать цикл переварить самого

    $timeout(function() { $scope.window_width = $window.innerWidth; });

  2. использование $scope.$apply(); как

    $scope.window_width = $window.innerWidth; $scope.$apply();

он re is a demo

+0

О, мой бог ... Я так смущен – MFB