我正在学习Angular的服务。 T试过服务和工厂,可以让他们工作,但我无法让供应商工作。我检查了几个SO答案的解决方案,仍然无法使其工作
这是我的提供者:
app.provider('EmployeeService', function EmployeeServiceProvider() {
var list = [{
name: '',
skill: ''
}];
this.$get = function() {
return {
getList: function() {
return list
},
add: function(employee) {
list.push(employee);
}
};
}
})
我的控制员:
app.controller('MainCtrl', function($scope, EmployeeService) {
$scope.employee = {
name: '',
skill: ''
};
$scope.employees = EmployeeService.getList();
$scope.add = function(employee) {
EmployeeService.add(employee);
$scope.employee = {
name: '',
skill: ''
}
}
});
和app.js
var app = angular.module('myApp', []);
app.config(['EmployeeServiceProvider', function(EmployeeServiceProvider) {
var user = {
name: 'Rob',
skill: 'Hacker'
};
EmployeeServiceProvider.add(user);
}]);
我的HTML就是这样:
<html lang="en" ng-app="myApp">
<head>
<meta charset="UTF-8">
<title>AngularJS app</title>
<script src="js\angular\angular.js"></script>
<script src="app\app.js"></script>
<script src="app\controllers\MainCtrl.js"></script>
<script src="app\services\EmployeeService.js"></script>
</head>
<body>
<div ng-controller='MainCtrl'>
<input type="text" ng-model="employee.name" placeholder="Enter employee name"/>
<input type="text" ng-model="employee.skill" placeholder="Enter employee skill"/>
<button ng-click="add(employee)">Add</button>
<hr>
<table>
<thead>
<tr>
<td>Name</td>
<td>Skill</td>
</tr>
</thead>
<tbody>
<tr ng-repeat="person in employees">
<td>{{person.name}}</td>
<td>{{person.skill}}</td>
</tr>
</tbody>
</table>
</div>
</body>
</html>
我希望在配置之前在配置中添加值。但我无法做到。控制台中也没有显示任何内容。请告诉我如何正确配置提供程序并在配置中使用它。
答案 0 :(得分:2)
问题出在您的provider
代码中。您的提供程序需要返回包含$get
属性的对象。只需将$get
添加到this
即可。在$get
内,您需要返回控制器使用的函数(即add()
和getList()
)
您需要将add
功能保留在两个位置:
首先,在提供商的return{ }
内(作为$get
的兄弟姐妹),因为您在config
函数中使用它。
app.config(['EmployeeServiceProvider', function(EmployeeServiceProvider) {
var user = {
name: 'Rob',
skill: 'Hacker'
};
EmployeeServiceProvider.add(user); //<-- Here
}]);
其次,您需要将添加功能保留在$get
的回复中,因为您在控制器中使用它。
$scope.add = function(employee) {
EmployeeService.add(employee); <-- Here
$scope.employee = {
name: '',
skill: ''
}
}
以下是您的提供商的完整代码:
app.provider('EmployeeService', function EmployeeServiceProvider() {
var list = [{
name: '',
skill: ''
}];
return{
add: function(employee) { //This is for Config's visibility
list.push(employee);
},
$get:function(){
return{
add: function(employee) { // This is for controller's visibility
list.push(employee);
},
getList: function() {
return list
}
}
}
}
})
您还可以将方法($get
和add
)绑定到this
,而不是返回单独的对象
app.provider('EmployeeService', function EmployeeServiceProvider() {
var list = [{
name: '',
skill: ''
}];
this.add= function(employee) {
list.push(employee);
}
this.$get = function() {
return {
getList: function() {
return list
},
add: function(employee) {
list.push(employee);
}
};
}
})
这是工作plunkr