1

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

  • 127.0.0.1:8080/站点
  • 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

4 回答 4

0

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

于 2018-02-28T04:03:31.027 回答
0

您可以使用如下所示的 rootscope。

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)
});
于 2018-03-27T12:27:10.173 回答
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>
于 2018-02-28T01:55:40.090 回答
0

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

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

如果您的数据是在某个事件之后设置的,您只需要注意“设置数据后获取”之类的顺序顺序

如果必须在controller_1的初始化中设置数据,而controller_2是controller_1的兄弟,那么可以在进入controller_1和controller_2之前把用户数据的初始化逻辑放在一起。

于 2018-02-28T02:39:38.643 回答