Возвращать переменные на фабриках Angular JS?

0

У меня есть следующий код...

spa.factory("linkService", function() {
    var currentLink = null;
    return {currentLink:};
});

var cssController = spa.controller("cssController", function(linkService, currentLink) {
        this.fileName = linkService.currentLink;
});

var navigationController = spa.controller("navigationController", function(linkService, currentLink) {
    this.setLink = function(setValue) {
        linkService.currentLink  = setValue;
    };
    this.checkCurrent = function(checkValue) {
        return linkService.currentLink == checkValue;
    }
});

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

После проверки консоли, я считаю, что проблема с этим скриптом лежит на фабрике.

Попытка функции фабрики linkService - предоставить переменную currentLink которой можно получить доступ и динамически изменить несколько контроллеров. Переменная внутри фабрики, к которой я верю, должна быть доступна, введя фабрику в зависимость от функции контроллера, а также от переменной.

В чем проблема?

Теги:
variables
factory
service

2 ответа

1
Лучший ответ

Заводская фабрика linkService возвращает объект с слотом 'currentLink' и его значение не определено.

Вам нужно вернуть переменную напрямую или вы можете вернуть объект, который ссылается на вашу переменную, или вы можете вернуть объект, который включает в себя getter и seters для ваших переменных.

Последний вариант имеет то преимущество, что имеет хороший интерфейс, определенный на месте. Ваш код будет более читаемым.

spa.factory("linkService", function() {
   var currentLink = "/myLink.html";
    /* accessor for currentLink */
    var getLink = function(){
      return currentLink;
    }; 
    return {get: getLink}; // service interface
});

--- Обновить

Еще несколько деталей:

  • currentLink - это переменная, к которой следует обращаться, и которая присутствует только в контексте linkService
  • фабрика возвращает объект "{get: getLink}" в качестве службы. Поэтому, если контроллер внедряет linkService, он получает этот объект. Использование linkService.get(); вы можете получить доступ к переменной currentLink.
  • getLink - это только локальная функция. Он служит аксессуаром.
  • 0
    Мне трудно понять это. Если я правильно понимаю, мы устанавливаем объект только для установки другого объекта в качестве значения первого объекта, а затем возвращаем массив, в котором значение индексируется как «get». Почему мы не можем просто объявить первый объект и покончить с ним?
  • 0
    Я добавил некоторые объяснения. Это помогает?
Показать ещё 2 комментария
0

Завод должен возвращать объекты/методы как таковые:

spa.factory("linkService", function() {
    var linkServiceFactory = {};
    var _currentLink = null;
    linkServiceFactory.currentLink = _currentLink;
    return linkServiceFactory;

});

В контроллере, чтобы ввести его с заводским названием, чтобы получить его подчасти:

 var cssController = spa.controller("cssController", function(linkService) {
            this.fileName = linkService.currentLink;
    });

По аналогии,

var navigationController = spa.controller("navigationController", function(linkService) {
    // other code.
});

Ещё вопросы

Сообщество Overcoder
Наверх
Меню