Как объявить объект в Angular JS, который не является сервисом, но не загрязняет глобальную область видимости?

С тех пор я обнаружил, что могу возвращать экземпляры объекта, используя метод get() на моей фабрике, который возвращает новые экземпляры службы.

Но что, если мой объект не является сервисом (здесь речь идет о семантике). Например, у меня есть страница со множеством диаграмм, объект диаграммы (ниже) не является (семантически) службой.

Так что я должен объявить это, используя что-то вроде шаблона factory/provider/etc? Это кажется неправильным, так как на самом деле это не сервис. Но мне нужно сослаться на него с моего контроллера, поэтому его нужно внедрить или каким-то образом сделать доступным. И я не хочу, чтобы это загрязняло глобальную область.

var Chart = function () {
    var self = this;
    this.initialize = function (name, clientMethod, usingDateRange, usesAnalytics, initCB, serviceCB, highchartsConfig) {

        this.name = name;
        this.clientMethod = clientMethod;
        this.usingDateRange = usingDateRange;
        this.usesAnalytics = usesAnalytics;
        this.initCB = initCB;
        this.serviceCB = serviceCB;
        this.highchartsConfig = highchartsConfig;

        this.$chart = $('#' + name);
        this.isIncluded = false;

        this.highchartsConfig.chart.renderTo = this.name;

        this.initCB && this.initCB(this);
    };
};

person williamsandonz    schedule 02.12.2013    source источник


Ответы (1)


Посмотрите на module.value(). Из документа:

Зарегистрируйте службу значений с помощью $injector, например строку, число, массив, объект или функцию. Это сокращение от регистрации службы, где свойство $get ее провайдера является фабричной функцией, которая не принимает аргументов и возвращает службу значения.

ОБНОВИТЬ

Не уверен, что вам это еще интересно, но я наконец нашел правильный ответ на ваш вопрос - воспользуйтесь сервисом $controller. ЗДЕСЬ Я создал простую демонстрацию:

app.controller('MainCtrl', function($scope, $controller) {

  function Person($interpolate, name, surname){
    var greetStr = "Hello {{name + ' ' + surname}}!";
    var greetExp = $interpolate(greetStr);
    this.greet = greetExp({name:name, surname:surname});
  }

  $scope.person1 = $controller(Person, {name:"Jack", surname:"Daniels"});
  $scope.person2 = $controller(Person, {name:"Johny", surname:"Walker"});
});

(Я использовал $interpolate просто, чтобы показать, что DI angular автоматически разрешает любые известные ему зависимости. Остальные зависимости [locals] могут быть переданы в качестве второго аргумента $controller.)< /эм>

person artur grzesiak    schedule 02.12.2013
comment
@Baconbeastnz да, действительно. - person artur grzesiak; 03.12.2013
comment
Мне нужен не синглтон. Но в любом случае, правильно ли тогда сказать, что любой пользовательский объект, который вы пишете (при использовании angular), должен быть объявлен в одном из этих сервисов значений/фабрик? Независимо от того, какова семантика? (Просто кажется семантически неинтуитивным? - person williamsandonz; 03.12.2013