我正在尝试编写一个服务,向我的路由(NodeJs)发出一个http请求,以便将用户添加到数据库。
如果我只是在控制器中编写它可以工作,但在刷新浏览器之前你不会看到用户添加:
我在控制器中的代码:
//Function to add a user to the db
$scope.inviteUser = function(){
$http.post('/api/users/invite', {
'email': $scope.user.email,
'role_id': $scope.user.role
}, {
headers: {
"Content-Type": "text/plain"
}
})
.success(function(data, status, headers, config) {
console.log("Successfully saved a user to the DB", data);
$scope.userInfo.push(data);
})
.error(function(data, status, headers, config) {
console.log("Failed to add user to DB");
});
}
我在服务中需要它的原因是因为堆栈上的人告诉我它将解决我当前面临的问题,即当添加用户时,在刷新浏览器之前不会看到它。这是因为我有一个带有按钮邀请的视图,当你点击它时会弹出一个弹出窗口(md-dialog - > angular material)。该对话框有自己的tmple.html文件。在邀请按钮所在的视图中是$ scope.userInfo链接到(在函数inviteUser中定义 - 上面的代码)
带有邀请按钮的视图代码和添加用户的列表:
<div id="sidebar" class="md-whiteframe-z4" ng-data-color="">
<div style="height: 80px;"></div>
<div class="userList">
<li id="customLI" ng-repeat="user in userInfo" id="userPos" class="circular md-whiteframe-z2" style="background-color: {{ user.color }} " ng-click=" showPopUpDeletionConfirmation(); setDeleteId( user._id )" ng-data-id="{{ user._id }} ">
<p class="initials" id="userValue" style="top: {{ user.top }};" >
<custom id="user._id"></custom>
{{user.initials}}
</p>
<md-tooltip>
<!-- Delete this user --> {{user.name}}
</md-tooltip>
</li>
</div>
</div>
对话框的代码:
<md-dialog aria-label="" ng-controller="CalendarCtrl">
<form name="form" >
<md-toolbar>
<div class="md-toolbar-tools">
<h1 class="customH1">Invite a user</h1>
<span flex></span>
<!-- <md-button class="md-icon-button" ng-click="closeDialog()">
<md-icon md-svg-src="images/ic_close_24px.svg" aria-label="Close dialog"></md-icon>
</md-button> -->
</div>
</md-toolbar>
<md-dialog-content>
<div id="containerForm">
<div layout="row">
<md-input-container flex="">
<div class="form-group" ng-class="{ 'has-success': form.email.$valid && submitted,'has-error': form.email.$invalid && submitted }">
<label>Enter the user's e-mail</label>
<input type="email" name="email" id="to" class="form-control" ng-model="user.email" required mongoose-error/>
<p class="help-block" ng-show="form.email.$error.email && submitted">
Doesn't look like a valid email.
</p>
<p class="help-block" ng-show="form.email.$error.required && submitted">
What's your email address?
</p>
<p class="help-block" ng-show="form.email.$error.mongoose">
{{ errors.email }}
</p>
</div>
</md-input-container>
</div>
<br /><br />
<div ng-show="form.email.$dirty && form.email.$valid">
<h5>Assign one of the following role's:</h5>
<div id="wrapperRadioButtons">
<md-radio-group ng-model="user.role">
<md-radio-button ng-repeat="userrole in roleInfo" value="{{userrole.id}}" class="md-primary">{{userrole.role}}</md-radio-button>
</md-radio-group>
</div>
</div>
<br />
</div>
</md-dialog-content>
<div class="md-actions" layout="row" >
<md-button ng-click="closeDialog()" class="md-primary">Cancel</md-button>
<md-button id="send_email" ng-click="inviteUser(); closeDialog()" class="md-primary">Invite</md-button>
</div>
</form>
</md-dialog>
这是我编写的服务,并尝试链接到函数inviteUsers:
zazzleApp.factory('UserService', ['$q', '$http', function ($q, $http) {
var service = {};
service.get = function() {
var deferred = $q.defer();
deferred.resolve(service.data);
return deferred.promise;
}
service.save = function(data) {
var promise = $http({
method: 'POST',
url: 'api/users/invite'
})
var deferred = $q.defer();
service.data.push(data);
deferred.resolve();
return deferred.promise;
}
return service;
}
]);
我的控制器的一部分:
angular.module('zazzleToolPlannerApp')
.controller('CalendarCtrl', function ($scope, $mdDialog, $http, $rootScope, $timeout, User, Auth, UserService) {
//Function to add a user to the db
$scope.inviteUser = function(){
var obj = {
'email': $scope.user.email,
'role_id': $scope.user.role
};
UserService.save(obj).then(function(){
$scope.getUsers();
})
}
});
现在,当我尝试添加用户时,我的控制台出现错误 - &gt; https://gyazo.com/34b39d7eda18b8afd9ef11094b4f429a
基本上我要问的是如何编写一个发出http请求并将其链接到控制器的服务....
旁注:我之前从未这样做过,这就是为什么它可能不起作用。
答案 0 :(得分:2)
我只能在你的日志中看到
typeError无法读取属性&#39; push&#39;在object.service.save中未定义的
我认为这与您的HTTP请求没有任何关系。
您尚未定义service.data.push(data);
,这是他转储的地方
在将值推送到它之前尝试将data
对象的service
属性定义为数组(它不知道它是一个数组,因此它无法访问数组原型函数)
这样做
service = { data: [] };
希望这会有所帮助。
答案 1 :(得分:1)
您在控制台中收到错误的原因是service.data.push(data);
中的 service.data 不存在。您的意思可能是将新用户推送到尚未创建的用户数组中(您似乎对代码中的“数据”感到困惑:P)。
无论如何,解决问题的方法要简单得多: 在服务中,您可以将$ http.post()返回给控制器,并在.success()回调控制器中处理请求。此外,您需要更新的用户列表应驻留在服务中,并从控制器绑定到该服务;这样,在添加新用户而不刷新浏览器之后,它将保持模板更新。您只需从服务中检索$ http回调的用户列表。
如果你仍然觉得这个令人困惑,我可以写一个小提琴。
编辑:这是小提琴:http://jsfiddle.net/bosch/8pnL23k7/。希望它能帮助您更好地理解概念