我正在使用 AngularJS 构建一个类似控制台的应用程序。我的要求之一是包含控制台的 div 会自动向下滚动。我使用监控内容并相应调整scrollTop
div 属性的指令实现了这一点:
app.directive('autoScroll', function () {
return {
restrict: 'A',
link: function (scope, element, attrs, ctrls) {
var scrollToBottom = function () {
element[0].scrollTop = element[0].scrollHeight;
};
scope.$watchCollection('outputLines', scrollToBottom);
}
};
});
第一种显示行的方法是ng-repeat
结合使用无序列表和大括号语法进行绑定:
<div auto-scroll id="withHtml" class="list">
<ul>
<li ng-repeat="line in outputLines">{{line.text}}</li>
<li>>> {{currentInput}}</li>
</ul>
</div>
正如您在这个小提琴的绿色输出区域中看到的那样,这非常有效。输入行(以开头的行>>
始终可见。
但其中一项要求也是在输出行中呈现 HTML。因此,我开始使用 ngSanitize 模块并从大括号语法切换到使用ng-bind-html
指令:
<div auto-scroll id="withHtml" class="list">
<ul>
<li ng-repeat="line in outputLines" ng-bind-html="line.text"></li>
<li>>> {{currentInput}}</li>
</ul>
</div>
这导致输入行总是移出可见区域。正如您在上面提到的小提琴中的红色输出区域中看到的那样:
在这两种情况下,生成的输出看起来都一样。所以这是我的问题:为什么滚动行为会根据我使用大括号语法还是 ng-bind-html 指令而有所不同?