这是一个小提琴:http://jsfiddle.net/a0eLhcbm/
我有一个简单的设置:
<div ng-app="demo" ng-controller="PageController">
{{ page.time }}
<div ng-controller="UsernameController">
{{ user.name }}
</div>
</div>
有一个函数,比方说,从其他地方使用ajax获取user.name,该函数属于控制器PageController。
问题:无论如何,只要控制器PageController收到信息,我就可以让UsernameController中的{{ user.name }}
自动更新?
这是我的javascript设置:
var app = angular.module( 'demo', [] );
function_that_fetches_for_username = function() {
//Some function that fetch for username asynchronously
};
app.controller( 'PageController', function ( $scope ) {
//Initial data
$scope.page = {};
$scope.page.time = Date();
function_that_fetches_for_username();
//How can I make the UsernameController to update its view from this Controller as soon as this controller receives the information?
});
app.controller( 'UsernameController', function( $scope ) {
//Initial data
$scope.user = {};
$scope.user.name = "";
//How can I automatically updated the $scope.user.name in view as soon as the PageController receives the information about the username?
});
答案 0 :(得分:1)
你可以在pageController中定义你的用户(也就是UsernameController的父控制器),每当你在pageController中更改它时,它也会在usernameController中更新
第二个解决方案是在父级中使用ng-view,在路由中使用控制器用于UsernameController
索引文件
<div ng-app="demo" ng-controller="PageController">
{{ page.time }}
<ng-view></ng-view>
</div>
user.html
<div ng-controller="UsernameController">
{{ user.name }}
</div>
路线编码
.when("/user",{
controller:"usernameController",
templateUrl : 'user.html'
})
第三种解决方案是提供服务
.factory("userFactory",function(){
var user = {};
return{
setUser : function(usern){
user = usern;
},
getUser : function(usern){
return user;
},
}
}) 现在,您可以从服务中获取用户并设置为服务。
答案 1 :(得分:1)
您可以通过多个控制器执行其中一项共享相同的值:
将值提升到所有感兴趣的控制器都可以访问的更高级别范围。控制器将通过范围继承来获取它,因为angular会自动通过范围层次结构搜索值。
获得该值的人通过所有控制器都可以访问的更高级别范围广播它。听取此广播的所有控制器都将获得该值。
答案 2 :(得分:1)
可能有很多方法可以解决这个问题,我的共同点是使用以下两种方法之一:
[ 1 ]创建一个 service ,您可以将其共享到应用程序的任何部分(控制器,服务,指令和过滤器)。
关于您的问题,您只需创建一个可以在您的控制器之间共享的User
服务。下面的解决方案假定function_that_fetches_for_username()
是一个服务UserResource
,它具有模拟从服务器获取数据的方法get()
。 User
服务是一个空对象,在所有控制器之间共享。
<强> DEMO 强>
<强> JAVASCRIPT 强>
angular.module('demo', [])
.service('UserResource', function($timeout) {
this.get = function() {
return $timeout(function() {
return {
id: 'w3g45w34g5w34g5w34g5w3',
name: 'Ryan'
};
}, 2000);
};
})
.service('User', function() {
return {};
})
.controller('PageController', function($scope, UserResource, User) {
$scope.page = {
time: Date()
};
UserResource.get().then(function(data) {
angular.extend(User, data);
});
})
.controller('UsernameController', function($scope, User) {
$scope.user = User;
});
<强> HTML 强>
<div ng-app="demo" ng-controller="PageController">
{{ page.time }}
<hr>
<div ng-controller="UsernameController">
<div ng-if="user.name">
{{ user.name }}
</div>
<div ng-if="!user.name" style="color: red">
Waiting for Response...
</div>
</div>
</div>
[ 2 ]使用controllerAs语法声明 controllers 。对子控制器使用此类表示法来使用别名访问父控制器。
<强> DEMO 强>
<强> JAVASCRIPT 强>
angular.module('demo', [])
.service('UserResource', function($timeout) {
this.get = function() {
return $timeout(function() {
return {
id: 'w3g45w34g5w34g5w34g5w3',
name: 'Ryan'
};
}, 2000);
};
})
.controller('PageController', function(UserResource) {
var ctrl = this;
ctrl.page = {
time: Date()
};
ctrl.user = {};
UserResource.get().then(function(data) {
angular.extend(ctrl.user, data);
});
})
.controller('UsernameController', function() {
this.getUser = function(user) {
console.log(user);
};
});
<强> HTML 强>
<div ng-app="demo" ng-controller="PageController as PC">
{{ PC.page.time }}
<hr>
<div ng-controller="UsernameController as UC">
<div ng-if="PC.user.name">
{{ PC.user.name }}
</div>
<div ng-if="!PC.user.name" style="color: red">
Waiting for Response...
</div>
<button type="button" ng-click="UC.getUser(PC.user)"
ng-disabled="!PC.user.name">
Access user from Page Controller
</button>
</div>
</div>