Переменные области видимости AngularJS не обновляются в обещании / отсрочке jQuery

0

Я создаю одностраничное приложение на 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, похоже, не обновляется.

Я делаю что-то неправильно?

благодаря

2 ответа

0
Лучший ответ

Я нашел исправление.

В моем контроллере после 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');
            }
        }]);
    };

}]);

Ответ найден здесь

0

Вы должны вернуть deferred.promise Вместо срока deferred.promise().

--edit: мой плохой я не видел, что вы не используете $ q, как я неправильно понял.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню