情况
假设我有一个指令,它必须通过 ID 访问某些元素,在定义指令的元素内。可能发生的问题是,在评估指令时,子元素还没有。结果是,我无法通过它们的 ID 访问这些元素。
例子
<div ng-controller="MyCtrl">
<div color="elementId">
<div ng-repeat="item in items" id="{{ item.id }}">
{{ item.name }}
</div>
</div>
</div>
<script>
var myApp = angular.module('myApp',[]);
myApp.directive("color", function () {
return {
restrict: "A",
link: function (scope, element, attributes) {
var name = attributes.color,
el = element[0];
scope.$watch(name, function () {
var id = scope[name];
console.log(id); //id1
console.log(element.children().eq(0).attr("id")); //{{ item.id }}
element.find("#"+id).css("background-color","red");
});
}
};
});
function MyCtrl($scope) {
$scope.items = [
{ id:"id1", name:"item1" },
{ id:"id2", name:"item2" }
];
$scope.elementId="id1";
}
</script>
所以我的指令应该只用 id 绘制元素的背景颜色$scope.elementId
。(顺便说一句。我知道我可以更轻松地处理这个简单的例子,它应该只是说明一般问题)。问题是,ng-repeat 中元素的 id 还不存在。正如代码中的注释所指出的,id 仍然是“{{ item.id }}”。所以 Angular 还没有评估这部分。
问题
我现在明显的问题是:我怎样才能让我的指令等待后代元素被完全评估?
进一步解释
在我的实际应用程序中,我想要一个指令,它使我能够滚动到页面上的某些元素。我还使用分页指令来拆分我想要显示的元素。由于分页,只有真正可见的元素在 DOM 中,所以在我的控制器中已经过滤掉了不可见的元素。
我还有一个侧边栏,其中有指向所有元素(不仅是可见元素)的小链接。当有人点击侧边栏中的元素时,应该会发生两个事件:
- 跳转到正确的页面
- 滚动到当前元素
当我跳转到页面时,我基本上有我上面描述的情况。我有一个完整的新元素列表,必须由 ng-repeat 处理。但紧接着,我尝试告诉我的滚动指令,它应该滚动 ID 为“xy”的元素,但尚未分配此 ID。