2014-09-09 3 views
0

AngularJS новичок здесь с фоном jQuery. Используя AngularJS, я пытаюсь разработать навигационную панель с фиксированным верхом с фоном, который переходит от прозрачного к непрозрачному в окне прокрутки. Тем не менее, у меня возникают проблемы с привязкой окна к области $ scope.Bind window scroll the AngularJS way

Вот то, что я до сих пор, что не работает:

http://jsfiddle.net/brettwick86/pt33te3z/3/

function bgScroll($scope) { 
    angular.element(window).bind('scroll', function() { 
    $scope.scroll = window.pageYOffset; 
    $scope.height = document.getElementById('main-header').offsetHeight; 
    $scope.a = $scope.scroll/$scope.height; 
    $scope.bgColor = 'rgba(0,0,0,' + $scope.a + ')'; 
    }); 
} 

Вид:

<div ng-controller="bgScroll"> 
    <nav class="navbar navbar-inverse navbar-bw navbar-fixed-top" role="navigation" style="background-color: {{ bgColor }};"> 
    ... 
    </nav> 
</div> 

Любая помощь очень ценится!

ответ

0

angular.element делегаты jQuery (если они включены) или JQlite, что означает, что функции обратного вызова не применяются автоматически к вашему $scope.

function bgScroll($scope) { 
    angular.element(window).bind('scroll', function() { 
    $scope.scroll = window.pageYOffset; 
    $scope.height = document.getElementById('main-header').offsetHeight; 
    $scope.a = $scope.scroll/$scope.height; 
    $scope.bgColor = 'rgba(0,0,0,' + $scope.a + ')'; 

    // Apply the changes to the scope here 
    $scope.$apply(); 
    }); 
} 
+0

Примечания: 'angular.element' делегаты **' JQuery' ** только тогда, когда он включен, в противном случае он использует угловые-х ** 'JQlite' **, которая является облегченной версией JQuery. – ryeballar

+0

@ryeballar, отраженный в ответе –

+0

Спасибо за помощь. $ Scope. $ Apply(); 'именно то, что мне не хватало. Я знаю о jQlite, но не понимаю, как объект $ scope относится к угловому элементу, поэтому объяснение обратного вызова полезно. – Brett

0

Вы должны избегать манипуляции с домом в контроллере. Вместо этого создайте новую директиву и сделайте ее там.

enter code here 


<div bg-scroll ng-controller="bgScroll"> 
    <nav class="navbar navbar-inverse navbar-bw navbar-fixed-top" role="navigation" style="background-color: {{ bgColor }};"> 
    ... 
    </nav> 
</div> 
myapp.directive('bgScroll', function() { 
    return { 
     restrict: 'A', 
     link: function (scope, element, attrs) { 
      angular.element(window).bind('scroll', function() { 
       scope.scroll = window.pageYOffset; 
       scope.height = document.getElementById('main-header').offsetHeight; 
       scope.a = scope.scroll/scope.height; 
       scope.bgColor = 'rgba(0,0,0,' + scope.a + ')'; 
      }); 
scope.$on('$destroy', function() { 
     angular.element(window).unbind('scroll'); 
     }); 
     } 
    }; 
}); 
+0

В моем коде я думал, что манипуляция DOM произошла в представлении: '