角度离子 - 理解模型,工厂和服务

时间:2015-05-16 18:32:23

标签: angularjs ionic-framework ionic

我刚开始接受离子和角度,并且无法理解使用工厂/服务进行建模的含义。

场景:

  • 我想建模一个具有属性和方法的Contact对象。
  • 我想要一个对象AddressBook,它具有一个包含Contact对象列表的属性,并且还有方法。

从我阅读过的所有文献中,我想为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

3 个答案:

答案 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上的更多资源而言,你应该检查以下链接中的一些转换填充和插件: