Angularjs 角离子-了解模型、工厂和服务
我刚刚开始学习ionic和angular,在理解使用工厂/服务进行建模的含义方面遇到了困难 情景:Angularjs 角离子-了解模型、工厂和服务,angularjs,ionic-framework,ionic,Angularjs,Ionic Framework,Ionic,我刚刚开始学习ionic和angular,在理解使用工厂/服务进行建模的含义方面遇到了困难 情景: 我想建模一个具有属性和方法的联系人对象 我想要一个对象地址簿,它有一个属性,包括一个联系人对象列表,还有一个方法 从我读过的所有文献中,我想为联系人和通讯录创建一个工厂/服务 但是既然Contact是一个单体,我该如何组合这些东西呢?一旦我“创建”了一个新联系人,因为它是一个单身汉,它不只是对原始联系人进行更改吗 angular.module('blah.services', ['ionic.
- 我想建模一个具有属性和方法的联系人对象
- 我想要一个对象地址簿,它有一个属性,包括一个联系人对象列表,还有一个方法李>
angular.module('blah.services', ['ionic.utils'])
.factory('Contact', function($q){
var o = {
"name" : '',
"email" : ''
};
return o;
})
.factory('AddressBook', function($q, Contact){
var o = {};
o.contacts = [];
o.addContact = function(contact){
o.contacts.push(contact);
}
return o;
});
// and then somehwere something like
angular.module('blah.controllers', ['blah.services'])
.controller('somethingCtrl', function($scope, Contact, AddressBook) {
/* what am i supposed to do here?
is it something like
var c = new Contact();
c.name = 'foo';
AddressBook.addContact(c);
*/
});
以下是我已经读过的一些内容,但仍然无法理解
我为你的OOP思维鼓掌。这绝对是一个很好的做事方式。不幸的是,您在课堂上思考,而
ES5
目前不支持这一点。我给你的建议是不要放弃你现有的这种方法,而是开始编写ES6
代码并将其转换成ES5
。通过这种方式,您可以使联系人成为类,通讯录确实包含一系列联系人
关于ES6
go的更多资源,您应该从以下链接检查一些传输垫片和插件:
- 出于某种原因,您认为角度服务不同于它们的实际用途。在Angular的情况下,它们只是用作Angular所包含的依赖注入模式的元素。他们对面向对象没有发言权
我的意思是,如果您有一个“类”功能
Contact
(而不是您创建的服务):
然后你可以做var contact1=新联系人(“foo”)代码>并且不需要有角度服务
如果您想在以后进行注入和模拟测试,您可能仍然应该创建一个角度注入,但它只不过是一个函数值,因此您可以使用.value
:
.value("Contact", function Contact(){...})
.controller("SomeCtrl", function($scope, Contact){
$scope.contact1 = new Contact("foo");
}
/*我在这里该怎么办?它是否类似于var c=new Contact()
嗯,不,不是。传递给控制器的联系人是指工厂返回的任何内容,即您创建的对象o
您可能希望探索的另一种方法是创建一个“模型”工厂,并返回一个带有“联系人”函数(可以在控制器中实例化)的对象和一个包含“联系人”数组的“地址簿”对象。例如:
angular.module('blah.services', ['ionic.utils'])
.factory('model', function($q){
return {
Contact : function(name, email) {
this.name = name;
this.email = email;
},
addressBook : {
contacts: []
}
};
})
.controller('somethingCtrl', function($scope, model) {
// Add a contact to the address book
model.addressBook.push(new model.Contact("foo", "foo@bar"));
// Now model.addressBook contains a new model.Contact
});
您还可以在工厂中创建contacts
数组作为本地/私有变量(如var contacts=[];
在return语句之外),并在addressBook对象中添加自定义getter/setter来操作它。Javascript不需要类。ES6类是已经存在的功能的语法糖<代码>新建
在ES5中可以很好地创建新实例。(此外,这是一种观点:class
和new
在Javascript中实际上是不好的做法,添加它们只是为了安抚来自其他语言且不想学习新方法的开发人员)(我希望这不是反OO的结果;我认为面向对象可能非常有用。我用OO的方式编写了大量Javascript。我只是相信ES6类并不是解决这一问题的最佳方式。但是,对于这个问题来说,更重要的是,它们不是解决这一问题的必要方式——如果是这样的话,那么天生就不可能使用垫片e、 )看看这里的第一个代码片段,它解释了如何使工厂正常工作:。或多或少,在工厂中返回一个函数;new
对函数执行操作,调用函数的一个新实例作为构造函数(即this
是新实例),并且通常返回它的一个副本(只要你不返回另一个对象)。我建议编写/使用.create
函数,而不是new
。这是一个很好的评论。这足以作为一个答案。谢谢。谢谢你向我展示这一点。我不会想到以这种方式使用value。非常有用。
angular.module('blah.services', ['ionic.utils'])
.factory('model', function($q){
return {
Contact : function(name, email) {
this.name = name;
this.email = email;
},
addressBook : {
contacts: []
}
};
})
.controller('somethingCtrl', function($scope, model) {
// Add a contact to the address book
model.addressBook.push(new model.Contact("foo", "foo@bar"));
// Now model.addressBook contains a new model.Contact
});