了解模型,工厂和服务

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

场景:

  • 我想建立一个具有属性和方法的Contact对象。
  • 我想要一个对象AddressBook,该对象具有一个包含Contact对象列表的属性,并且还包含方法。
  • 从我读过的所有文献中,我想为联系人创建一个工厂/服务,为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填充和插件:

  • https://github.com/paulmillr/es6-shim/
  • https://www.npmjs.com/package/gulp-traceur
  • 链接地址: http://www.djcxy.com/p/77897.html

    上一篇: understanding models, factories and services

    下一篇: update a service variable within an $http callback