У меня на самом деле большая проблема в моем угловом применении.AngularJS: Losing scope в директиве после обещания
У меня есть фабрика, которая выполняет http-запрос, чтобы получить спулер и возвращает обещание.
Spooler.prototype.load = function() {
var self = this;
var deferred = $q.defer();
$http.post('/spooler/' + this.id + '/load')
.success(function(data) {
self.statistics = data.statistics;
deferred.resolve(self);
})
.error(function(err, code) {
deferred.reject(err);
$log.error(err, code);
});
return deferred.promise;
};
Проблема происходит в моем контроллере, когда я использую «то()» ключевое слово, значения внутри этого затем будут переданы директивы следующим образом:
$scope.load = function(){
spooler.load().then(
function(dataSpooler){
$scope.spooler = dataSpooler;
$scope.custom = 4; // example of random var inside then()
}
function() {
$scope.dataFail = 'error error' ;
}
);
}
При входе в переменную обычай в представлении, все хорошо, я вижу «4». Однако проблема возникает, когда я использую эту переменную в своей директиве следующим образом:
<highchart-pie items="custom"></highchart-pie>
Вот код Директивы:
.directive('highchartPie', function() {
return {
restrict: 'E',
replace: true,
scope: {
items : '='
},
controller: function ($scope, $element, $attrs) {
},
template: '<div style="width:100%;margin: 0 auto;">not working</div>', //
link: function (scope, element, attrs) {
console.log(scope); // i can see the item value 4
console.log(scope.items); !!! undefined !!!
link function is actually way bigger and renders the element to the template (useless to be shown)
}
}
Вот мой вывод, когда я задаю
$scope.custom = 4;
Внутри функции then() это не работает, потому что директива, вероятно, не получает значения вовремя (даже в функции ссылок в директиве, которую видит журнал).
Если я объявляю $ scope.custom = 4; в верхней части контроллера до метода then(), каждый работает плавно ...
Идея кто-нибудь? Заранее спасибо ! :)
Нет необходимости создавать новый обещание использовать '$ http' ... он возвращает обещание уже ... считается анти-модель. Просто верните '$ http' – charlietfl
Вы не можете видеть' scope.custom' внутри своей директивы, потому что у вас нет выделенных областей, называемых 'custom', вы должны использовать' scope.items', чтобы увидеть значение –
. Кроме того, я я также использую highcharts, а также в функции ссылок моей директивы, у меня есть '$ watch' на' items', и внутри этого часа лежит весь код высокой четкости, таким образом, каждый раз, когда данные (элементы) меняются, диаграмма get отображается снова с новый набор данных. Надеюсь, что это поможет. –