【发布时间】:2015-11-22 20:50:04
【问题描述】:
我尝试通过 ngRepeat 指令实现滚动到最后添加的条目。
我发现并调查了一些相关的 SO 问题:#1、#2。但还是不能解决问题。
代码很简单。 当用户向数组中添加新记录时,控制器会广播带有新添加项目名称的“滚动事件”,然后指令接收此事件并滚动到列表中新添加的条目。
<div ng-controller="MainCtrl">
<input ng-model="newItem" ng-keydown="$event.which === 13 && addNewItem(newItem)"/>
<button ng-click="addNewItem(newItem)">Add</button>
<div id="items-list" scroll-to-new-item>
<div ng-repeat="item in items | orderBy: 'name'">
<input ng-model="item.name" ng-readonly="true"/>
</div>
</div>
</div>
app.controller("MainCtrl", function($scope){
$scope.items = [
{id: 1, name: "aaa"}, {id: 2, name: "bbb"},
{id: 3, name: "ccc"}, {id: 4, name: "ddd"},
.......
];
$scope.addNewItem = function(newItem){
$scope.items.push({name: newItem});
$scope.$broadcast('scroll-event', newItem);
$scope.newItem = "";
};
});
这是我的指令,它应该滚动到列表中最后添加的记录。
app.directive("scrollToNewItem", function(){
return {
restrict: 'A',
link: function(scope, element, attrs) {
scope.$on('scroll-event', function (event, newValue) {
if(newValue){
var newItemHeightPosition = // !!! MY ISSUE HERE !!!
$('#items-list').animate({
scrollTop: newItemHeightPosition
}, 'slow');
}
});
}
};
});
但我不知道如何获得新添加项目的最高位置。我尝试了几种变体,但没有得到任何结果。例如以下 jquery 选择器不起作用:
$('#items-list').find('input[value=' + newValue +']');
$('#items-list').find('input').eq(newValue);
请注意,数组是按字母顺序排序的,这会使这项任务复杂化。
谁知道,如何解决这个问题?
提前致谢!
【问题讨论】:
-
你确定 "$('#items-list').find('input[value=' + newValue +']');"是不是写错了? ('input[value=' + newValue +']') 应该是 ('input[value="' + newValue +'"]') 正确使用 " 在 newValue 的每一侧
-
@NachoDawg,没关系。还是不行。
-
好的。你能解释一下附加项目后dom的样子吗? newValue 变量是项目类吗?还是一个属性?
-
@NachoDawg。这是输入值。你可以在我的 JSFiddle 中看到它jsfiddle.net/k66Za/128
-
@gbalduzzi。请仔细阅读我的问题。它不能解决我的问题。
标签: javascript jquery css angularjs