我刚开始接受离子和角度,并且无法理解使用工厂/服务进行建模的含义。
场景:
从我阅读过的所有文献中,我想为Contact创建一个工厂/服务,为AddressBook创建一个。
但是由于Contact是一个单身人士,我该如何组合这些东西呢?一旦我"创造"一个新的联系人,因为它是一个单身人士,它不仅仅是对原作进行更改吗?
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
答案 0 :(得分:4)
出于某种原因,您将Angular服务视为与实际情况不同的东西。在Angular的情况下,它们只是用作Angular所包含的依赖注入模式的元素。他们对面向对象没有发言权。
我的意思是,如果你有一个"类"函数Contact
(不是您创建的服务):
function Contact(name){
this.name = name;
}
然后您可以执行var contact1 = new Contact("foo");
并且
你可能仍然应该创建一个Angular注射器,如果你想稍后注射它们并进行模拟测试,但它只不过是一个函数值,所以你可以使用.value
:< / p>
.value("Contact", function Contact(){...})
.controller("SomeCtrl", function($scope, Contact){
$scope.contact1 = new Contact("foo");
}
答案 1 :(得分:1)
/ *我该怎么办?它是像var c = new Contact();
嗯,不,不是。传递给控制器的联系人引用工厂返回的任何内容,即您创建的对象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
});
。
您可能想要探索的另一种方法是创建一个&#34;模型&#34;工厂并使用&#34;联系&#34;返回一个对象函数(可以在控制器中实例化)和&#34; addressBook&#34;包含&#34;联系人&#34;的对象阵列。例如:
contacts
您也可以在工厂中将var contacts = [];
数组创建为本地/私有变量(如在return语句之外的dynamic_cast<>
中),并在addressBook对象中添加自定义getter / setter来操作它。
答案 2 :(得分:0)
我赞赏你在这里的OOP思考。这绝对是一个很好的方式。不幸的是,您正在考虑使用类,ES5
目前不支持此类。我的建议是不要放弃你拥有的这种方法,而是开始编写ES6
代码并将其转换为ES5
。这样,您可以将联系人设为类, AddressBook 确实包含联系人的数组。
就ES6
上的更多资源而言,你应该检查以下链接中的一些转换填充和插件: