每当出现新消息时,我都会尝试自动滚动到底部。
我的代码移动了滚动条,但并没有将其移到确切的底部。请帮助。这是我的朋克。
http://plnkr.co/edit/NSwZFtmBYZuW7e2iAUq9
这是我的HTML:
<!DOCTYPE html> <html> <head> <script data-require="angular.js@1.3.0-beta.5" data-semver="1.3.0-beta.5" src="https://code.angularjs.org/1.3.0-beta.5/angular.js"></script> <link rel="stylesheet" href="style.css" /> <script src="script.js"></script> </head> <body> <div ng-app="Sojharo"> <div ng-controller="MyController"> <div id="chatBox"> <div ng-repeat="message in messages"> <div class="chatMessage"> <div class="messageTextInMessage">{{message.msg}}</div> </div> </div> </div> <div class="chatControls"> <form ng-submit="sendIM(im)"> <input type="text" ng-model="im.msg" placeholder="Send a message" class="chatTextField" /> </form> Type and press Enter </div> </div> </div> </body> </html>
这是javascript:
angular.module('Sojharo', []) .controller('MyController', function($scope) { $scope.messages = []; $scope.im = {}; $scope.sendIM = function(msg) { $scope.messages.push(msg); $scope.im = {}; var chatBox = document.getElementById('chatBox'); chatBox.scrollTop = 300 + 8 + ($scope.messages.length * 240); } });
请也让我知道有角度的方式。我在Internet上发现以下方法无效:
这些是这些指令
.directive("myStream", function(){ return { restrict: 'A', scope:{config:'='}, link: function(scope, element, attributes){ //Element is whatever element this "directive" is on getUserMedia( {video:true}, function (stream) { console.log(stream) element.src = URL.createObjectURL(stream); //scope.config = {localvideo: element.src}; //scope.$apply(); //sometimes this can be unsafe. }, function(error){ console.log(error) }); } } }) .directive('ngFocus', [function() { var FOCUS_CLASS = "ng-focused"; return { restrict: 'A', require: 'ngModel', link: function(scope, element, attrs, ctrl) { ctrl.$focused = false; element.bind('focus', function(evt) { element.addClass(FOCUS_CLASS); scope.$apply(function() {ctrl.$focused = true;}); }).bind('blur', function(evt) { element.removeClass(FOCUS_CLASS); scope.$apply(function() {ctrl.$focused = false;}); }); } } }]);
您可以为此创建一个指令:
.directive('scrollBottom', function () { return { scope: { scrollBottom: "=" }, link: function (scope, element) { scope.$watchCollection('scrollBottom', function (newValue) { if (newValue) { $(element).scrollTop($(element)[0].scrollHeight); } }); } } })
http://plnkr.co/edit/H6tFjw1590jHT28Uihcx?p=preview
顺便说一句:避免在控制器内部进行DOM操作(改用指令)。