打开新窗口angularjs后在控制器之间共享变量

时间:2013-09-17 12:52:46

标签: angularjs angularjs-service

我处于一种情况,我必须将用户定义的对象从一个控制器传递到另一个控制器,该控制器在新窗口中打开。我尝试了几种常用的方法,例如$emit到$ rootScope使用工厂或服务,$broadcast从那里到第二个控制器。

但我总是陷入根深蒂固。我可以在那里记录变量,但是当新窗口打开时它们似乎消失了(甚至在新窗口的控制台中都没有出现未定义的)。我可以从rootscope获得固定变量,但不会从第一个控制器发出任何内容。

有人知道如何解决这个问题吗?

这是我的代码:

// SHARING DATA BETWEEN CONTROLLERS VIA ROOT SCOPE:

var table_app = angular.module("tableApp", [])
.factory("sharedVars", function($rootScope, $log) {
    /*
     Receive emitted message and broadcast it.
     */
    $rootScope.$on("handleEmit", function(event, object){
        var value1 = object.data1;
        var value2 = object.data2;
        var value3 = object.data3;
        $log.log(value2, value3)           // WORKS
        $rootScope.$broadcast("handleBroadcast", 
            {data1: value1, data2: value2, data3: value3});
    })

    // JUST TO CHECK IF I CAN GET DATA FROM HERE:
    return { fixedSharedObject: {data1: 22, data2: 33, data3: 44}}  // WORKS
})
.controller("FirstCtrl", function ($scope, $rootScope, $q, $log, sharedVars) {
    $scope.onClick = function(number, adress) {
        newWindow = window.open(adress, "Zweitfenster", "width=700, height=900");
        newWindow.focus();
        var lineNumber = document.getElementById("lineCell" + number).innerHTML;
        var blockNumber = document.getElementById("blockCell" + number).innerHTML;
        var tripId = document.getElementById("tripCell" + number).innerHTML;
        $log.log(lineNumber, blockNumber, tripId);                             // WORKS
        $scope.$emit("handleEmit", 
            {data1:lineNumber, data2: blockNumber, data3: tripId});
    }
})
.controller("SecondCtrl", function($scope, $rootScope, $log, sharedVars){
    $scope.singleTripLineNumber = sharedVars.fixedSharedObject;               // WORKS
    $scope.singleTripBlockNumber = sharedVars.fixedSharedObject;
    $scope.$on("handleBroadcast", function(event, object){
        var value1 = object.data1;
        var value2 = object.data2;                                    // DOES NOT WORK!
        var value3 = object.data3;
        $log.log(value3)
    })
});

1 个答案:

答案 0 :(得分:5)

你不能这样做。不共享窗口/选项卡之间的JS环境。你能做什么:

  • 将数据作为URL /路径参数传递到window.open(),使用目标控制器中的$location服务检索它们。
  • 使用浏览器的本地存储(会话存储不在选项卡之间共享,请参阅ejain的评论),如果支持,则为cookie。
相关问题