Javascript 模板不使用';t渲染重新加载的数据:AngularJS
我有两个控制器可以相互通信 控制器1:Javascript 模板不使用';t渲染重新加载的数据:AngularJS,javascript,angularjs,Javascript,Angularjs,我有两个控制器可以相互通信 控制器1: $scope.$on("reloadUsers", function (event) { $http.get("/users").success(function(data) { $scope.users = data; console.log($scope.users); }); }); $http.get("/users").success(function(da
$scope.$on("reloadUsers", function (event) {
$http.get("/users").success(function(data) {
$scope.users = data;
console.log($scope.users);
});
});
$http.get("/users").success(function(data) {
$scope.users = data;
});
控制器2:
$scope.editUser = function(id){
$http({
url: "/users/"+ id,
method: "PUT",
data: {
"firstName":$scope.user.firstName,
"lastName": $scope.user.lastName,
}
});
$scope.$emit("reloadUsers");
}
我的模板如下所示(两个模式对话框):
模板1:
<div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true" ng-controller="Controller 1">
<div ng-repeat="user in users>
<a data-toggle="modal" data-target="#configureUserModal" href="#" ng-click="getUserId(user.id)" data-id="user.id">{{user.first_name + ' ' +user.last_name}}</a>
</div>
</div>
我将尝试重写以下代码:
$scope.editUser = function(id){
$http.put("/users/" + id,
{
firstName: $scope.user.firstName,
lastName: $scope.user.lastName
})
.success(function(){
$scope.$emit("reloadUsers");
});
}
希望它能起作用
编辑:
自定义更新方法
angular.module('unknown', ['ngResource'])
.factory('Users', ['$resource', function($resource){
return $resource('/users/:id', { id:'@id' }, {
update: { method: 'PUT' },
get: { method: 'GET' }
});
}]);
经过大量的重构,我终于找到了答案。首先,我实现了一个服务来获取我的用户列表
angular.module('app').factory('usersService', function($http) {
var usersService = {
getUsers: function () {
return $http.get("/users/").then(function (response) {
return response.data;
});
}
};
return usersService;
});
我使用了then
,因为HTTP GET请求是异步的,但在收到响应数据之前,我无法显示用户列表
然后在控制器1
中,我添加了以下代码位:
$scope.users = usersService;
usersService.getUsers().then(function (asyncUsers) {
$scope.users = asyncUsers;
});
$scope.$watch('users', function (users) {
if (angular.isDefined(users)) {
console.log("$scope.users has data");
}
});
$scope.$on("reloadUsers", function (event) {
usersService.getUsers().then(function (asyncUsers) {
$scope.users = asyncUsers;
});
});
在这里,我基本上只是调用服务并等待$scope.users
获取它的值。为了准确地找出发生这种情况的时间,我只需要一个$scope.watch
函数。我还有一个函数,用于等待从控制器2
发出的重新加载用户
事件,该事件刷新$scope.users
中的数据
最后,在控制器2中,我有:
$scope.editUser = function(id){
$http({
url: "/user/"+ id,
method: "PUT",
data: {
"firstName": $scope.user.firstName,
"lastName": $scope.user.lastName,
}
}).success (function(data) {
$scope.$emit("reloadUsers");
});
}
只需调用$scope.emit
,指示是时候刷新了。所以我很确定我的问题是控制器之间缺乏通信,因为我没有使用服务,也没有使用异步GET请求。这个解决方案解决了这两个问题 尝试在http请求的成功方法中发出事件。我认为这是一个异步问题。@RaphaelMüller尝试过,但不幸没有成功。当我在发出后记录$scope.users
时,它会显示更新的数据!但是它没有出现在模板1
::当你只调用你的$http.put()
而不在之后调用$emit()
时会发生什么?@Kutyel这很尴尬,但即使没有$emit()
它的工作原理完全相同:/I我应该在$scope.users上使用$watch
功能吗?
?谢谢,但当Raphael建议时,我尝试了同样的方法,但没有成功:(啊,你太好了。别抱歉!谢谢你的帮助。我要玩一下$watch
和$digest
,看看这是否管用。嗯,这是个主意。我也要试试。我完全重构了我的代码,使用了你答案中的元素,它终于管用了!还要把我的解决方案放在这里。哈哈,我对它投了高票,所以在你编辑它之前我不能对它投低票。
$scope.editUser = function(id){
$http({
url: "/user/"+ id,
method: "PUT",
data: {
"firstName": $scope.user.firstName,
"lastName": $scope.user.lastName,
}
}).success (function(data) {
$scope.$emit("reloadUsers");
});
}