在不同路由的控制器之间共享变量 - AngularJS

时间:2018-02-28 00:46:41

标签: angularjs angularjs-controller angular-factory angularjs-view

我是Angularjs的新手,我正在尝试构建我的第一个应用程序。让我们说我必须加载两个不同视图的路线:

  • 127.0.0.1:8080/site
  • 127.0.0.1:8080/site_details

也许有两条不同的路线不是正确的程序,但这是另一个问题。

我有两个控制器:  控制器1:

app.controller('controller_1', function($scope, $http, user) {
          user.set('Test Example')
});

控制器2

app.controller('controller_2', function($scope, $http, user) {
        var xxx = user.get()
});

我想要做的是在这两个控制器之间共享数据。为此,我以这种方式提供服务:

app.factory('user', function($rootScope) {
 var savedData = {}

 function set(data) {
   savedData = data;
 }
 function get() {
  return savedData;
 }

 return {
  set: set,
  get: get
 }

});

通过环顾四周,似乎拥有这样的服务可以解决问题。但是,我在控制器2中使用函数get()获得的结果总是为空。 通过设置断点,我可以看到set()和get()函数都在服务中的各自函数中输入。

这是在属于不同路由的控制器之间共享数据的正确程序吗?

EDIT1 这两个视图以相同的方式构建,并在ng-view

中加载
<html ng-app="app" ng-controller='controller_1'>
        CONTROLLER 1
</html>

4 个答案:

答案 0 :(得分:0)

出现问题的原因是,controller_1创建之前未创建controller_2。您可以使用controller_2修改$timeout以引入一些延迟:

app.controller('controller_2', function($scope, $timeout, $http, user) {
    // The time out is added to check your code working,
    // You can replace the code or can use, its up to your requirement
    $timeout(function(){    
        var xxx = user.get();
        console.log(xxx);
    }, 500);
});

使用$ timeout将有一段时间来创建controller_1

同时实例化controller_2

<html ng-app="app">
  <body> 
     ........ 
    <div ng-controller='controller_1'>
       <div ng-controller='controller_2'>
       </div> 
    </div>
  </body> 
</html>

答案 1 :(得分:0)

首先,在服务之间共享数据是一种正确的方法。

在您的情况下,您需要确保在设置数据后获取数据的顺序。 使用$ timeout不是一个好方法,我认为应该有另一种方式,它取决于你的详细代码。

如果您的数据是在某个活动结束后设置的,那么您只需要注意订单顺序,例如“设置数据后”#&lt;

如果必须在controller_1的初始化中设置数据,并且controller_2是controller_1的兄弟,则可以在打开controller_1和controller_2之前放置用户数据的初始化逻辑。

答案 2 :(得分:0)

我认为你已经提供了工厂参考html的第一个和第一个 你给的第二个控制器。在这种情况下,您必须将工厂裁判提供给主页单页,其中您还加载子页面(您保存ng-view的地方)

答案 3 :(得分:0)

您可以使用如下的rootcope。

app.controller('controller_1', function($scope, $http, $rootScope) {
      $rootScope.UserInfo ="Test Example";
});

 app.controller('controller_2', function($scope, $http, $rootScope) {
    var xxx = $rootScope.UserInfo;
    console.log(xxx)
});