如何创建AngularJS中我的方法可用的自定义对象类

Pet*_*xey 15 angularjs

我是角色的忠实粉丝,但它有一些棘手的概念,它们之间存在极其微妙的差异,这就是其中之一.

我只想创建一个类,我可以用它在我的Angular控制器和工厂中创建自定义对象.它肯定不应该那么难,但我无法弄清楚如何做到这一点.我想有一个自定义的ResultSet类,我可以实例化它来创建ResultSet的实例.然而,对于我的生活,我无法弄清楚工厂诉服务的正确语法.

这是所有我想要的:

ResultSet = function(dataSet){ 
  this.filter = function(){ 
    # filters and returns dataSet
    # ...
  }
}
Run Code Online (Sandbox Code Playgroud)

然后我希望能够在控制器内实例化ResultSet的实例等:

MyApp.controller('pageCtrl', ['ResultSet',  (ResultSet) ->
  # ...
  rs = ResultSet.new(dataToFilter)
Run Code Online (Sandbox Code Playgroud)

如何创建允许我创建自定义对象实例的服务?

使用Angular Service而不是Factory似乎更正确,因为服务返回一个对象的实例(这正是我想要的).但我无法弄清楚如何做到这一点......

我如何使用服务来声明我的自定义ResultSet类,然后如何从中实例化实例?

Amr*_*lon 13

也许你正在寻找这样的东西:

.factory('User', function (Organisation) {

  /**
   * Constructor, with class name
   */
  function User(firstName, lastName, role, organisation) {
    // Public properties, assigned to the instance ('this')
    this.firstName = firstName;
    this.lastName = lastName;
    this.role = role;
    this.organisation = organisation;
  }

  /**
   * Public method, assigned to prototype
   */
  User.prototype.getFullName = function () {
    return this.firstName + ' ' + this.lastName;
  };

  /**
   * Private property
   */
  var possibleRoles = ['admin', 'editor', 'guest'];

  /**
   * Private function
   */
  function checkRole(role) {
    return possibleRoles.indexOf(role) !== -1;
  }    

  /**
   * Static property
   * Using copy to prevent modifications to private property
   */
  User.possibleRoles = angular.copy(possibleRoles);

  /**
   * Static method, assigned to class
   * Instance ('this') is not available in static context
   */
  User.build = function (data) {
    if (!checkRole(data.role)) {
      return;
    }
    return new User(
      data.first_name,
      data.last_name,
      data.role,
      Organisation.build(data.organisation) // another model
    );
  };

  /**
   * Return the constructor function
   */
  return User;
})
Run Code Online (Sandbox Code Playgroud)

来自Gert Hengeveld的这篇文章.


JB *_*zet 10

myApp.factory('ResulSet', function() {
    function ResultSetInstance(dataSet) { 
        this.filter = function(){ 
            // ...
        }
    }

    return {
        createNew: function(dataSet) {
            return new ResultSetInstance(dataSet);
        }
    };
});
Run Code Online (Sandbox Code Playgroud)

然后

myApp.controller('pageCtrl', function(ResultSet) {
    var someData = ...;
    var rs = ResultSet.createNew(someData);
}
Run Code Online (Sandbox Code Playgroud)

编辑(来自提问者)

在进一步试验这一点后,我发现你甚至不需要这个createNew方法.

myApp.factory('ResultSetClass', function() {
    ResultSetClass = function(dataSet) { 
        this.filter = function(){ 
            // ...
        }
    }

    return ResultSetClass
});
Run Code Online (Sandbox Code Playgroud)

工作得很好然后你可以打电话new ResultSetClass(args).

注意那些使用Coffeescript的人

Coffeescript将返回类实例中的最后一个变量或方法,因此如果您使用coffeescript(作为一般规则),则必须this在类定义的末尾返回

myApp.factory 'ResultSetClass', () ->
  ResultSetClass = (dataset) ->
    this.filter = () ->
      # do some stuff
    return this

  return ResultSetClass
Run Code Online (Sandbox Code Playgroud)

如果您没有this明确返回,那么当您打电话时,您会发现

myApp.factory 'ResultSetClass', () ->
  ResultSetClass = (dataset) ->
    this.filter = () ->
      # do some stuff
Run Code Online (Sandbox Code Playgroud)

那么你只需留下coffeescript返回的最后一件事就是filter方法.