Совместно использовать переменную между двумя окнами.Angularjs - PullRequest
0 голосов
/ 30 января 2019

Из моего приложения angularjs я открываю новое окно:

 $window.open($state.href('catalog-detalleTicketMapa', {
      id: $localStorage.idRamdom
    }), 'window', 'height=700,width=700');

И когда я закрываю это новое окно, я хочу, чтобы родительское окно узнало об этом событии, и я делаю следующее

// controller auxiliary window
vm.onExit = function () {
  $rootScope.$broadcast('ventanaCerrada');
};

$window.onbeforeunload = vm.onExit;

// controller main windows
$scope.$on('ventanaCerrada', function () {
  $rootScope.ventanaAbierta = false;
});

Если он входит в событие $ rootScope. $ Broadcast, но не попадает в область действия события. $ On.

Я также протестировал localStorage, но он обновляется только во вспомогательном окне, но в основномодин не делает.

Как я могу совместно использовать переменную между двумя открытыми окнами в моем браузере?

Ответы [ 2 ]

0 голосов
/ 30 января 2019

Обычно вы не можете разделить данные хранилища между двумя окнами.Если вам действительно нужно, чтобы изменения данных в одном окне отражались в другом окне, используйте сокет или базу данных для получения данных в реальном времени.

0 голосов
/ 30 января 2019

Когда вы открываете новое окно с помощью $window.open, оно не разделяет область видимости с вызывающим окном, поэтому невозможно (afaik) передавать что-либо между ними с помощью angular.Но вызывающее окно может обращаться к глобальным переменным в открывшемся окне, поэтому я использую что-то вроде наблюдателя для наблюдения за этой переменной.

У меня есть следующий код в WindowService, чтобы открыть новое окно (мы открываем только одно окно; если вам нужно больше, вам нужно настроить код):

angular.module('myproject')
.service('WindowService', ['$window', '$interval', '$timeout', 
function ($window, $interval, $timeout) {

    var self = this;
    this.myOpenWindow = null;

    // opens a window and starts the wait-function
    this.openWindow = function (url, callbackFn) {
        // open the window
        self.myOpenWindow = $window.open(url);

        // Puts focus on the new window
        if (window.focus) {
            self.myOpenWindow.focus();
        }

        // check for response in opened window
        self.waitForResponse(callbackFn);
    };

    this.waitStarted = false;

    this.waitForResponse = function (callbackFn) {
        if (!self.waitStarted && self.myOpenWindow) {
            self.waitStarted = true;
            var intervalPeriod = 1000; // check once every second
            var waitHandler;
            waitHandler = $interval(function (index) {
                if (self.myOpenWindow.closed) {
                    // window was closed, commence cleaning operation
                    $interval.cancel(waitHandler);
                    waitHandler = $timeout(function () {
                        // re-initialize waitStarted so it can be used again
                        self.waitStarted = false;
                        // call callback-Function when the window is closed
                        if (callbackFn) {
                            callbackFn();
                        }
                    }, intervalPeriod);

                } else {
                    // window is still open, check if the observed variable is set 
                    if (self.myOpenWindow && self.myOpenWindow.response_message) {
                        var message = self.myOpenWindow.response_message;
                        // do what you want with the message
                        // ...
                        // afterwards close the window (or whatever)
                        if (self.myOpenWindow) {
                            self.myOpenWindow.close();
                        }
                    }
                }
            }, intervalPeriod);
        }
    };
}
]);

В открывшемся окне вам нужно где-то установить эту глобальную переменную, например, так:

window['response_message'] = { 'result': 'Done' };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...