Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angularjs 角离子-了解模型、工厂和服务_Angularjs_Ionic Framework_Ionic - Fatal编程技术网

Angularjs 角离子-了解模型、工厂和服务

Angularjs 角离子-了解模型、工厂和服务,angularjs,ionic-framework,ionic,Angularjs,Ionic Framework,Ionic,我刚刚开始学习ionic和angular,在理解使用工厂/服务进行建模的含义方面遇到了困难 情景: 我想建模一个具有属性和方法的联系人对象 我想要一个对象地址簿,它有一个属性,包括一个联系人对象列表,还有一个方法 从我读过的所有文献中,我想为联系人和通讯录创建一个工厂/服务 但是既然Contact是一个单体,我该如何组合这些东西呢?一旦我“创建”了一个新联系人,因为它是一个单身汉,它不只是对原始联系人进行更改吗 angular.module('blah.services', ['ionic.

我刚刚开始学习ionic和angular,在理解使用工厂/服务进行建模的含义方面遇到了困难

情景:

  • 我想建模一个具有属性和方法的联系人对象
  • 我想要一个对象地址簿,它有一个属性,包括一个联系人对象列表,还有一个方法
从我读过的所有文献中,我想为联系人和通讯录创建一个工厂/服务

但是既然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);
  */

});
以下是我已经读过的一些内容,但仍然无法理解





我为你的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
      });