我想在AngularJS中实现我自己的自定义对象/类。但是,我仍然坚持使用工厂/服务作为自定义对象的概念 - 我知道工厂和服务是为了提供应用程序的业务逻辑,但我可以在应用程序中创建多个工厂和服务吗?如果是这样的话,“单身人士”一词究竟是什么意思?(我读过的许多文章都描述了服务)是什么意思?
例如,这是否是在AngularJS中创建用学生对象填充的基本学校对象的有效和/或首选方法?
app.factory('schoolService',function(student){
var school = {};
school.students = [];
school.addStudent = function(){
var newStudent = new student();
this.students.push(newStudent);
}
return school;
}
app.service('student',function(){
//anyway to toss in a constructor here?
this.name = 'name';
this.getName = function(){
return this.name;
}
}
app.controller('schoolCtrl',function(schoolService){
schoolService.addStudent(); //obviously normally wouldn't do this, but for demonstration purposes
$scope.students = schoolService.students;
//expect $scope.students to equal an array of length 1, with one student object
}
提前致谢,对所有嵌套问题感到抱歉!
答案 0 :(得分:1)
单身人士保持不变。控制器在被调用时被加载。您可以将学生存储在服务中,因为它将在您的应用程序的整个生命周期中存储,并且可以在控制器之间共享。
https://jsfiddle.net/jtgd6tjn/
角
function AppCtrl($scope, SchoolService) {
$scope.students = SchoolService.students;
$scope.addStudent = function() {
SchoolService.students.push($scope.newStudent);
$scope.newStudent = {};
}
}
function SchoolService() {
var service = {
students: []
};
return service;
}
HTML
<div ng-app="myApp" ng-controller="AppCtrl">
<form ng-submit="addStudent()">
<input type="text" ng-model="newStudent.first">
<br>
<input type="text" ng-model="newStudent.last">
<br>
<button type="submit">
Add New Student
</button>
</form>
<hr>
<ul>
<li ng-repeat="student in students"> {{ student.first}} {{ student.last }} </li>
</ul>
</div>
答案 1 :(得分:1)
实际上,当您在控制器中注入service
时,服务对象已经实例化,因为Angular内部已经在您的服务的构造函数上调用了new
。 (请记住,.service()
只是一个构造函数)
您可以出于两个不同的原因使用.service
和.factory
。是的,它们都是单身,但.factory
可以产生多个实例。
“这就是工厂所做的,他们以你想要的方式创建新的对象。”
使用.factory
,它会返回您想要的任何内容。下面,工厂返回一个构造函数。 Angular只会缓存您返回的内容以供重用。
function PersonService() {
function Person() {
this.foo = function () {
};
}
Person.prototype.bar = function () {
};
return Person;
}
angular
.module('app')
.factory('PersonService', PersonService);
然后在某个控制器中:
function PersonController(PersonService) {
// new instance!
var newPerson = new PersonService();
console.log(newPerson);
}
“[...] a .service()本质上是.factory()调用的”最终结果“。。service()通过调用函数上的new
为我们提供返回值,这可能是限制性的,而.factory()在编译过程之前是一步,因为我们选择实现和返回哪种模式。“
答案 2 :(得分:0)
服务/工厂 用作 逻辑容器 。它们可以创建一次并注入多个控制器以执行业务逻辑。这有助于代码的可重用性和逻辑抽象。
&#39;的 的Singleton 强>&#39;是定义服务的正确方法。它们在应用程序被引导时初始化一次。一般而言,您可以将服务用作&#39; getter和setter &#39;。如果您熟悉编码,则必须知道它的含义。
并且,就你的例子而言,没有提到服务不会像你想要的那样创建对象。要在Javascript中创建新对象,您可以按照以下方法
getInfo (id) {
return db.main('events').where('id', id).select()
.then(result => {
if (result.length == 0) {
// you can also just throw your error object thing,
// but standard Error are generally the convention
throw new Error('Event does not exist')
}
const [event] = result
event.status = this.getStatus(id)
event.content = this.getContent(id)
event.price = this.getPrice(id)
return Promise.all([this.getUsers(id), this.getHosts(id)])
.then(([users, hosts]) => {
event.users = users
event.hosts = hosts
// this is the only value that
// this.getInfo(id).then(value => {/* ... */}) will see
return event
}
})
}
希望这能回答你的问题。 您可以在此Blog
中详细了解服务/工厂