我认为解决这个问题的最好方法是在你的指令中使用一个观察者。
var app = angular.module('app', []);
app.controller('Main', function ($scope, $timeout) {
//this simulates data being loaded asynchronously after 3 second
$timeout(function () {
$scope.list = [1, 2, 3, 4];
}, 3000);
});
app.directive("mydirective", function()
{
return {
restrict: "A",
link: function(scope, element, attrs)
{
scope.$watch('list', function (newVal, oldVal) {
if (newVal) {
//initialize the plugns etc
scope.result = 'Model has been populated';
}
});
}
};
});
在我的示例中,我在控制器中使用 $timeout 来模拟数据的异步加载,一旦填充了“列表”模型,指令内的观察者就会意识到它(newVal 不为空或未定义),然后可以初始化插件. 这是一种更好的方法,而不是控制器内部的回调,因为您的代码更加简洁。
这是一个jsBin
编辑:
请记住,在填充模型时必须触发摘要循环。如果您使用 $resource 或 $http 从服务器获取数据,则不必担心,但如果您在 Angular 之外执行此操作,则必须使用 $scope.$apply() 触发摘要循环,因此观察者可以知道模型已填充。