了解模型,工厂和服务
我刚开始接触离子和角度,并且无法理解使用工厂/服务进行建模的含义。
场景:
从我读过的所有文献中,我想为联系人创建一个工厂/服务,为AddressBook创建一个工厂/服务。
但既然联系是一个单身人士,我该如何把这些东西放在一起呢? 一旦我“创建”了一个新的联系人,因为它是一个单身人士,是不是只是对原有内容进行更改?
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);
*/
});
这里有一些我已经读过,但仍然无法弄清楚。
http://viralpatel.net/blogs/angularjs-service-factory-tutorial/
http://mcgivery.com/ionic-using-factories-and-web-services-for-dynamic-data/
https://docs.angularjs.org/guide/providers
angular.service vs angular.factory
出于某种原因,您出于某种原因将Angular服务视为与实际意图不同的东西。 在Angular的情况下,它们只是用作Angular拥抱的依赖注入模式的元素。 他们对面向对象没有发言权。
我的意思是,如果你有一个“类”功能Contact
(不是你创建的服务):
function Contact(name){
this.name = name;
}
那么你可以做var contact1 = new Contact("foo");
而且它不需要有一个Angular服务。
如果你想稍后注入它们并进行模拟测试,你可能应该仍然创建一个Angular注入器,但它只不过是一个函数值,所以你可以使用.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来操作它。
我赞赏你在这里的OOP思想。 这绝对是一个很好的办法。 不幸的是,你正在考虑类和ES5
目前不支持这一点。 我对你的建议是不要放弃你拥有的这种方法,而是开始编写ES6
代码并将其转换成ES5
。 这样你可以使联系人成为一个类 , AddressBook确实会包含一个联系人数组。
至于ES6
更多资源,你应该从下面的链接中检查一些transpiling填充和插件: