Как создать пользовательский класс объектов, доступный для моих методов в AngularJS

Я большой поклонник angular, но у него появилось несколько сложных концепций с чрезвычайно тонкими различиями между ними, и это один из них.

Я просто хочу создать класс, который я могу использовать для создания пользовательских объектов в моих контроллерах и фабриках angular. Это, конечно, не должно быть так сложно, но я не могу понять, как это сделать. Я хочу иметь собственный класс ResultSet, который я могу создать для создания экземпляров ResultSet. Однако для жизни я не могу понять правильный синтаксис службы factory v. Для использования.

Это все, что я хочу:

ResultSet = function(dataSet){ 
  this.filter = function(){ 
    # filters and returns dataSet
    # ...
  }
}

а затем я хочу создать экземпляр ResultSet внутри контроллера и т.д.

MyApp.controller('pageCtrl', ['ResultSet',  (ResultSet) ->
  # ...
  rs = ResultSet.new(dataToFilter)

Как создать службу, которая позволяет мне создавать экземпляры моего пользовательского объекта?

Кажется более правильным использовать службу angular, а не factory, поскольку служба возвращает экземпляр объекта (именно это я и хочу). Но я не могу понять, как это сделать...

Как я могу использовать службу для объявления моего пользовательского класса ResultSet, а затем как мне создать экземпляр из него?

Ответ 1

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

    return {
        createNew: function(dataSet) {
            return new ResultSetInstance(dataSet);
        }
    };
});

а затем

myApp.controller('pageCtrl', function(ResultSet) {
    var someData = ...;
    var rs = ResultSet.createNew(someData);
}

Изменить (от вопросника)

В эксперименте с этим я обнаружил, что вам даже не нужен метод createNew.

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

    return ResultSetClass
});

работает нормально, а затем вы можете вызвать new ResultSetClass(args).

Примечание для тех, кто использует Coffeescript

Coffeescript вернет последнюю переменную или метод в вашем экземпляре класса, поэтому, если вы используете coffeescript (как общее правило), обязательно возвратите this в конце определения класса

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

  return ResultSetClass

Если вы не возвращаете this явно, вы обнаружите, что когда вы вызываете

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

тогда вы просто останетесь с последним, что возвращает coffeescript, который является методом filter.

Ответ 2

Возможно, вы искали что-то вроде этого:

.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;
})

Из this сообщение Герт Хенгевельд.