【问题标题】:Sharing data between controllers of 2 different pages using Angularjs使用 Angularjs 在 2 个不同页面的控制器之间共享数据
【发布时间】:2016-05-06 05:12:45
【问题描述】:

任务是在选择框中选择一个设备,并在另一个页面上显示与名称相关的属性,即名称、类型、设备系列等。

我遇到的问题是数据被设置在第一个控制器中。这很好,但它不会转到使用 DeviceController2 的下一页。 DeviceController2 的警报中没有显示任何值。我只需要将设备发送到下一页。

为此,我的第一个控制器是

App.controller('DeviceController', function($scope,$http,commonDeviceService) {
    var self = this;
    self.show = function(device){
        commonDeviceService.set(device);
        alert("Device selected is "+device);
        window.open('url to next page');
    };
});

commonDeviceService 是我为控制器提供的常用服务。

第二个控制器是

App.controller('DeviceController2', function($scope,$http,commonDeviceService) {
    $scope.device = commonDeviceService.get();
    alert($scope.device);
}); 

而commonDeviceService是

App.factory('commonDeviceService', function() {
    var shareddata='';

   function set(data) {
       shareddata = data;
       alert("shared data in set call is "+shareddata);
   }

   function get() {
       alert("shared data in get call is "+ shareddata);
       return shareddata;
   }

   return {
       set: set,
       get: get
   };
});

【问题讨论】:

  • 是的,一旦重新加载页面,您将丢失数据。您可以使用 $window.sessionStorage 来保存您的数据。那样就不会丢失了。

标签: javascript html angularjs controllers


【解决方案1】:

通常我们需要在我们的 angularjs 应用程序中保持一个客户端会话状态,这样它才能在应用程序内的页面刷新和导航中存活下来。对于这种情况,您可以使用 $window.sessionStorage

控制器1:

App.controller('DeviceController', function($scope,$http,$window) {
var self = this;
self.show = function(device){
    $window.sessionStorage.device = device;
    alert("Device selected is "+device);
    window.open('url to next page');
};
});

控制器2:

App.controller('DeviceController2', function($scope,$http,$window) {
$scope.device = $window.sessionStorage.device;
alert($scope.device);
});

这将满足您在控制器之间共享数据的目的,但请记住,其存储容量限制为 5MB。此外,如果您打开一个指向完全相同 URL 的新选项卡,它将是一个新的 sessionStorage 对象。参考:$window.sessionStorage vs $cookieStore

我已经删除了 Angular 工厂的代码,假设它的唯一目的是为了这种数据共享,现在已经通过会话存储来实现。

【讨论】:

  • 非常感谢......它适用于我的应用程序。我只想问有没有限制?
【解决方案2】:

您如何显示新页面? 新页面只是您要在其中呈现的模板,还是带有自己的 ng-app 的新 HTML?

如果您可以为您提供 HTML 标记,那将非常有帮助。

【讨论】:

  • 起初我通过单击按钮(使用href)打开下一页,这仍然会使页面刷新。然后我看到了这个(window.open())并应用了它,仍然没有用。我知道问题是我正在打开一个新页面。在该页面中,ng-app 是相同的。 ng-controller 是 DeviceController2。
  • @Yatin 以后请大家用cmets提问,不要发问题作为答案。
  • @GregL 道歉。我是 SO 新手,并且禁用了 cmets 选项。会照顾的。
【解决方案3】:

发生这种情况是因为您正在通过这样做重新加载页面:

window.open('url to next page');

因此,整个 Angular 应用程序被重新加载,所有数据都丢失了。

您应该使用$location 服务进行导航。因此,给定以下路由配置:

    angular.module('app')
    .config(function($routeProvider) {
        $routeProvider.when('/page1', {templateUrl: 'page1.html', controller: 'Page1Controller'});
        $routeProvider.when('/page2', {templateUrl: 'page2.html', controller: 'Page2Controller'});
    });

您可以通过执行以下操作从代码导航到 page2:

$location.path('/page2');

【讨论】:

  • 起初我通过单击按钮(使用href)打开下一页,这仍然会使页面刷新。然后我看到了这个(window.open())。我知道问题是我正在打开一个新页面。那么这个问题怎么解决呢?
  • 如果你有多个页面(单页面应用程序),你应该使用路由器,最好的有 angular-router 或 angular-ui-router。
  • 不使用 angular-router 就不能做到这一点吗?让我把情况说得更清楚些。我在第一页选择设备,然后单击“显示详细信息”按钮。现在按钮重定向到新页面,我希望新页面保存设备值并相应地显示该设备的属性。属性的显示不是我现在关心的。
  • 使用$location.path('/page2')从代码导航到第二页。
  • 两个页面的url不同。我不想在第一个 url 中附加值。我想拨打一个新的网址。
【解决方案4】:

尝试给定的更改。在 controller2 中创建一个函数并在页面加载时调用它,在该函数中从服务中获取数据。

您在这里尝试获取可能尚未设置的数据。

第二个控制器是

App.controller('DeviceController2', function($scope,$http,commonDeviceService) {
    var self = this;
    $scope.device = null;

    self.show = function(){
        $scope.device = commonDeviceService.get();
        alert($scope.device);
    };

    self.show();
});

你也可以用给定的方式来做

控制器2

App.controller('DeviceController2', function($scope,$http,commonDeviceService) {
var self = this;
$scope.device = null;
self.show = function(){
        commonDeviceService.get().then( function(data) {
            $scope.device = data;
            alert($scope.device);
        }, function(error) {
            //error
        });
};
 self.show();
});

服务

App.service('commonDeviceService', function() {
    var shareddata = null;

   function set(data) {
       shareddata = data;
       alert("shared data in set call is "+shareddata);
   }

   function get() {
       alert("shared data in get call is "+ shareddata);
       return shareddata;
   }

   var data = {
       set: set,
       get: get
   };

   return data;
});

【讨论】:

  • 我认为我在重定向到新页面时犯了错误。我现在正在使用 window.open('url to new page')。数据从第一个控制器设置,警报显示数据已设置。现在当新页面打开时。在该页面中,警报显示没有数据值
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-12-15
  • 2014-03-22
  • 1970-01-01
  • 2013-05-28
  • 2014-12-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多