Передача асинхронно полученных данных в директиву
В настоящее время у меня есть AngularJScontroller
это в основном получает некоторыеJSON
асинхронно через$http.get()
вызов, затем связывание полученных данных с некоторой переменной области видимости.
Возобновленная версияcontroller
код:
mapsControllers.controller('interactionsController', ['$http', function($http) {
var ctrlModel = this;
$http.get("data/interactionsPages.json").
success(function(data) {
ctrlModel.sidebar = {};
ctrlModel.sidebar.pages = data;
}).
error(function() {...});
}]);
Тогда у меня есть обычайdirective
который получает те же переменные области видимости черезHTML
элемент.
Возобновленная версияdirective
код:
mapsDirectives.directive('sidebar', function() {
return {
restrict : 'E',
scope : {
pages : '@'
},
controller : function($scope) {
$scope.firstPage = 0;
$scope.lastPage = $scope.pages.length - 1;
$scope.activePage = 0;
//...
},
link : function(scope) {
console.log(scope.pages);
},
templateURL : 'sidebar.html'
}
});
Возобновленная версияHTML
:
<body>
<div ng-controller='interactionsController as interactionsCtrl'>
<mm-sidebar pages='{{interactionsCtrl.ctrlModel.sidebar.pages}}'>
</mm-sidebar>
</div>
</body>
Проблема в том, что$http.get()
является асинхронным, директива плохо инициализируется (например:$scope.pages.length - 1
не определено).
Я не смог найти ничего, что решило бы эту проблему для меня, хотя есть некоторые представленные решения, которые, казалось бы, решают проблему. А именно, я пытался наблюдать за переменными, только инициализируя переменные после обнаруженных изменений, как предлагалось во многих других постах. Для тестирования я использовал что-то вроде:
//... inside the directive's return{ }
link: function() {
scope.$watch('pages', function(pages){
if(pages)
console.log(pages);
});
}
Я проверил это, и функция $ watch не вызывалась более одного раза (зарегистрированное значениеundefined
), что, как я полагаю, означает, что он не обнаруживает изменение значения переменной. Однако я подтвердил, что значение менялось.
Итак, в чем здесь проблема?