Интеграция собственных классов JavaScript в приложение Angular

У меня есть собственный класс JavaScript:

var Holder = new function(elements) {

    this.elements = elements;

    this.anyFunction() {
        // use of this.elements
    };

};

Как использовать его в Angular-способе? Например, если я хотел бы использовать:

.controller('AnyController', ['Holder',
function (Holder) {

    var elements = [
        {id: 1, label: 'foo'},
        {id: 2, label: 'bar'}
    ];

    $scope.holder = new Holder(elements);

}])

Как мне тогда зарегистрировать свой класс Holder? Какие есть варианты (если есть)?

Параллельно, настолько ли плохо использовать нативные классы JavaScript в приложении Angular (т. е. без его интеграции в фреймворк)?


person sp00m    schedule 30.01.2014    source источник
comment
Почему бы не создать его как услугу? Метод .service может принимать класс. Ознакомьтесь с учебными пособиями о том, как сделать это с помощью Coffeescript, где они используют классы, а затем посмотрите на скомпилированный JavaScript.   -  person elclanrs    schedule 30.01.2014
comment
@elclanrs Если я правильно понял службы, все службы Angular являются одноэлементными приложениями (см. AngularJS: Создание сервисов, последний раздел: Сервисы как синглтоны), в то время как мне нужен новый экземпляр каждый раз, когда он вводится в параметр. Я ошибаюсь?   -  person sp00m    schedule 30.01.2014
comment
Насколько я понимаю, фабрика — это синглтон, но фабрика может генерировать класс, который может создавать экземпляры. Таким образом, фабрика вернет ссылку на конструктор при его внедрении или функцию, которая вызывает конструктор (без использования new). Но я не знаю, что является хорошей практикой на этом TBH.   -  person elclanrs    schedule 30.01.2014


Ответы (2)


Вы можете вернуть класс с фабрикой

    .factory('Holder', function() {
        return (function (){
            this.foo = foo;
            this.bar = bar;
        });
    });

Теперь, чтобы использовать это

.controller('AnyController', ['Holder', function (Holder) {
    var holder = new Holder();
}]);

ИЗМЕНИТЬ Используйте factory вместо service, как предлагается в комментариях.

person axelduch    schedule 30.01.2014
comment
затем назовите его фабрикой, если вам каждый раз нужны новые экземпляры :) - person OZ_; 30.01.2014

Насколько я понимаю, фабрика — это синглтон, но фабрика может генерировать класс, который может создавать экземпляры. Таким образом, фабрика вернет ссылку на конструктор, когда вы его вставите, или функцию-оболочку вокруг конструктора, чтобы использовать его без использования new:

.factory('Holder', function() {
  function Holder(elements) {
    this.elements = elements; 
  }
  Holder.prototype.get = function() {
    return this.elements;
  };
  return function(elements) {
    return new Holder(elements);
  };
})

.controller('Main', function($scope, Holder) {
  var elements = [
    {id: 1, label: 'foo'},
    {id: 2, label: 'bar'}
  ];
  $scope.elements = Holder(elements).get();
});
person elclanrs    schedule 30.01.2014