Я создаю одностраничное приложение на AngularJS
и у меня есть controller
с функцией, которая запускается при нажатии кнопки. Эта функция работает с обещанием. Когда функция решена, я обновляю корневую переменную и меняю путь $location
. Но корневая переменная и $location
не обновляются.
Обратите внимание, что весь код проверяется с производства
DOM:
<div ng-controller="ExampleController">
<button ng-click="button_function('I am a variable')">Run function</button>
</div>
контроллер:
app.controller('ExampleController', ['$scope', '$location', function($scope, $location) {
$scope.button_function = function(variable) {
$scope.$root.show_something = true;
my_function.something(variable).done(function(data) {
if (data) {
$scope.$root.show_something = false;
$location.path('/go-to-path');
} else {
alert('Something went wrong');
}
}]);
};
}]);
Это код my_function
:
var my_function = {
something: function(variable) {
var deferred = $.Deferred();
var window = window.open('http://dynamic.url/', '_blank');
$(window).on('loadstart', function(e) {
var url = e.originalEvent.url;
if (url === 'http://dynamic.url/expected_response') {
window.close();
deferred.resolve({
key_1: 'data',
key_2: 'more data'
});
}
});
return deferred.promise();
}
};
Все хорошо выглядит? Но когда my_function.something(variable)
"завершена" $location
и $scope.$root.show_something
, похоже, не обновляется.
Я делаю что-то неправильно?
благодаря
Я нашел исправление.
В моем контроллере после deferred
"сделано" я завернул мои переменные в $timeout
app.controller('ExampleController', ['$scope', '$location', '$timeout', function($scope, $location, $timeout) {
$scope.button_function = function(variable) {
$scope.$root.show_something = true;
my_function.something(variable).done(function(data) {
if (data) {
$timeout(function() {
$scope.$root.show_something = false;
$location.path('/go-to-path');
}, 1);
} else {
alert('Something went wrong');
}
}]);
};
}]);
Ответ найден здесь
Вы должны вернуть deferred.promise
Вместо срока deferred.promise()
.
--edit: мой плохой я не видел, что вы не используете $ q, как я неправильно понял.