我是Angularjs的新手,我正在尝试构建我的第一个应用程序。让我们说我必须加载两个不同视图的路线:
也许有两条不同的路线不是正确的程序,但这是另一个问题。
我有两个控制器: 控制器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>
答案 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)
});