将数据从工厂返回到控制器
Returning data from the factory to the controller
我是 AngularJS 的新手,这是我在 Whosebug 中的第一个问题。我已经阅读了很多关于这个问题的可能答案,但我没有找到解决方案。我的工厂里有这个(我认为重要的部分在点之间):
;(() => {
app.factory('Users', users)
users.inject = ['$state', 'UserServices']
function users($state, UserServices) {
users.users = [];
.....
users.activeDeactive = (userId, activate) => {
UserServices.activeDeactive(userId, activate).then(
response => {
console.log(response); //it shows "{status: 0}", which is the desired value
return response;
}
)
}
.....
return users;
}
})()
在我的控制器中:
;(() => {
app.controller('UsersCtrl', usersCtrl);
function usersCtrl($scope, $state, Users, users, vendors, profiles, clients) {
Users.users = users;
.....
$scope.activeDeactive = function(userId, activate) {
var response = Users.activeDeactive(userId, activate);
console.log(response); //it shows undefined
}
.....
};
})();
如何在控制器中也获得“{status: 0}”?我在这个问题上停留了很长时间......我读过关于等待服务解析数据,等待承诺等......但我认为这个问题要简单得多,因为我'已经成功将服务信息发送到这个工厂...现在的问题是将数据从工厂发送到控制器...非常感谢!
在控制器中使用以下语法。您的代码不起作用的原因是您编写了一个名为 Users.activeDeactive 的服务,您正在从控制器调用它但没有等待响应。等待响应非常重要。如果服务调用成功,就会执行then部分。在这里,您只需要像给定语法一样捕获响应。
如果有错误,会转到错误部分。
;(() => {
app.controller('UsersCtrl', usersCtrl);
function usersCtrl($scope, $state, Users, users, vendors, profiles, clients) {
Users.users = users;
.....
$scope.activeDeactive = function(userId, activate) {
Users.activeDeactive(userId, activate).then(function(data){
response = data;
console.log(response);
},
function(error){
console.log(error);
});
.....
};
})();
在用户工厂方法中 return 承诺。
users.activeDeactive = (userId, activate) => {
return UserServices.activeDeactive(userId, activate).then(
response => {
console.log(response);
return response;
}
)
}
并在控制器方法中更改为接受解析对象。
$scope.activeDeactive = function(userId, activate) {
Users.activeDeactive(userId, activate).then(response =>{
console.log(response);
});
}
这样做的原因是.. UserService 看起来像您在用户工厂中使用的 aync 方法。因此控制器方法将调用用户工厂方法,并且不会等到用户服务 return 的数据进入事件循环。使其工作 return 来自用户工厂方法的承诺。
我是 AngularJS 的新手,这是我在 Whosebug 中的第一个问题。我已经阅读了很多关于这个问题的可能答案,但我没有找到解决方案。我的工厂里有这个(我认为重要的部分在点之间):
;(() => {
app.factory('Users', users)
users.inject = ['$state', 'UserServices']
function users($state, UserServices) {
users.users = [];
.....
users.activeDeactive = (userId, activate) => {
UserServices.activeDeactive(userId, activate).then(
response => {
console.log(response); //it shows "{status: 0}", which is the desired value
return response;
}
)
}
.....
return users;
}
})()
在我的控制器中:
;(() => {
app.controller('UsersCtrl', usersCtrl);
function usersCtrl($scope, $state, Users, users, vendors, profiles, clients) {
Users.users = users;
.....
$scope.activeDeactive = function(userId, activate) {
var response = Users.activeDeactive(userId, activate);
console.log(response); //it shows undefined
}
.....
};
})();
如何在控制器中也获得“{status: 0}”?我在这个问题上停留了很长时间......我读过关于等待服务解析数据,等待承诺等......但我认为这个问题要简单得多,因为我'已经成功将服务信息发送到这个工厂...现在的问题是将数据从工厂发送到控制器...非常感谢!
在控制器中使用以下语法。您的代码不起作用的原因是您编写了一个名为 Users.activeDeactive 的服务,您正在从控制器调用它但没有等待响应。等待响应非常重要。如果服务调用成功,就会执行then部分。在这里,您只需要像给定语法一样捕获响应。 如果有错误,会转到错误部分。
;(() => {
app.controller('UsersCtrl', usersCtrl);
function usersCtrl($scope, $state, Users, users, vendors, profiles, clients) {
Users.users = users;
.....
$scope.activeDeactive = function(userId, activate) {
Users.activeDeactive(userId, activate).then(function(data){
response = data;
console.log(response);
},
function(error){
console.log(error);
});
.....
};
})();
在用户工厂方法中 return 承诺。
users.activeDeactive = (userId, activate) => {
return UserServices.activeDeactive(userId, activate).then(
response => {
console.log(response);
return response;
}
)
}
并在控制器方法中更改为接受解析对象。
$scope.activeDeactive = function(userId, activate) {
Users.activeDeactive(userId, activate).then(response =>{
console.log(response);
});
}
这样做的原因是.. UserService 看起来像您在用户工厂中使用的 aync 方法。因此控制器方法将调用用户工厂方法,并且不会等到用户服务 return 的数据进入事件循环。使其工作 return 来自用户工厂方法的承诺。