好的,这是我的解决方案,虽然它更像是一个模板。
Fiddle(检查控制台日志以查看结果)
我已将指令包装在foo
指令中fooParent
,如下所示:
<div foo-parent>
<div foo run="3"></div>
<div foo run="1"></div>
<div foo run="2"></div>
</div>
该fooParent
指令的存在几乎可以做三件事:
- 向项目公开函数,
foo
以便将它们添加到一般列表中
- 维护一个列表
foos
,将在链接后进行排序
- 按指定的运行顺序处理每个
foo
。
它看起来像这样:
app.directive('fooParent', function() {
var foos = [];
return {
restrict: 'A',
controller: ['$scope', '$element', '$attrs', '$transclude', function($scope, $element, $attrs, $transclude) {
this.addFoo = function(runOrder, element) {
foos.push({
run: 1*runOrder, // make sure run is an integer
element: element
});
};
}],
link: function(scope, element, attrs) {
foos.sort(function(a, b) {
return a.run - b.run;
});
// process all children here
angular.forEach(foos, function(foo) {
console.log(foo);
});
}
};
});
foo
看起来像:
app.directive('foo', function() {
return {
restrict: 'A',
require: '^fooParent',
link: function(scope, element, attrs, fooParent) {
fooParent.addFoo(attrs.run, element);
}
};
});
显然,您必须找出处理远程加载内容的最佳方法,特别是如果您希望它被串行加载。您的foo
指令将变得更加简化,因为加载和处理必须在fooParent
.