Как я могу передать данные с завода на мой контроллер в angularjs?

0

Я пытаюсь переместить всю бизнес-логику с моего контроллера на завод, но у меня есть некоторые проблемы с передачей данных полей.

factory.js

app.factory("Quote", function ($resource) {
    // TODO: this shouldn't start with /en/
    var quoteStatus = [];
    var quoteLanguage = [];

    var Quote = $resource("/en/quote/api/quote/:id", {}, {
        retrieve: {
          method: 'GET',
          params: {},
          isArray: true
        },
        query: {
          method: 'GET',
          params: {},
          isArray: true,
          url: '/en/quote/api/quote/'           
        },
        fields: {
          method: 'GET',
          url: '/en/quote/api/quote/fields/ '
        },
        update: {
          method: 'PATCH',
        },
    });

    Quote.fields().$promise.then(function (fields) {
        var tempObj = [];
        for (key in fields.status) {
            // must create a temp object to set the key using a variable
            tempObj[key] = fields.status[key];
            quoteStatus.push({
                value: key,
                text: tempObj[key]
            });
        }

        for (key in fields.language) {
            // must create a temp object to set the key using a variable
            tempObj[key] = fields.language[key];
            quoteLanguage.push({
                value: key,
                text: tempObj[key]
            });
        }

        //$scope.addLanguage($scope.language);

        Quote.status = quoteStatus;
        Quote.language = quoteLanguage;
    });

    return Quote;


});

controller.js

$scope.quoteStatus = Quote.status;

Однако это не работает, поскольку $ scope.quoteStatus не определен. Что мне не хватает?

Заранее спасибо.

Теги:
angularjs-controller
angularjs-service
angularjs-factory

1 ответ

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

Вы не можете ожидать, что операция async будет вестись синхронно.

В принципе, когда контроллер вводит Quote в свою заводскую функцию, то время создания объекта запроса Quote создается, а затем вызывает Quote.fields(). если вы спросите, что Quote.status внутри контроллера всегда будет возвращать undefined. Вы не поддерживаете обещание в любом месте, чтобы контроллер узнал, что данные готовы или нет.

Я думаю, вы должны ввести $q.when флаг там, чтобы проверить работу Quote.fields() или нет, а затем получить нужную переменную.

Для реализации выше упомянутой вещи вам нужно сохранить обещание Quote.fields() где-то в обслуживании. как ниже

var quoteFieldsPromise = Quote.fields().$promise.then(function (fields) {

   /// the code will be same here

};

Затем добавьте новый метод, который будет содержать объект quoteFieldsPromise и вернуть значение quoteStatus & quoteLanguage.

var getQuoteDetails = function(){
   $q.when(quoteFieldsPromise).then(function(){
      return { quoteStatus: Quote.quoteStatus, quoteLanguage: Quote.quoteLanguage };
   })
}

Но как вы вернули весь объект Quote, который имеет только объект $resource который необходимо изменить. Я хочу сказать, что метод getQuoteDetails который я создал, не может быть возвращен с помощью объекта Quote. Поэтому я скорее предпочел бы реорганизовать сервис ниже.

обслуживание

app.factory("Quote", function($resource, $q) {
    // TODO: this shouldn't start with /en/
    var quoteStatus = [], //kept private if needed
        quoteFieldsPromise, 
        quoteLanguage = [];//kept private if needed

    var QuoteApi = $resource("/en/quote/api/quote/:id", {}, {
        //inner code is as is 
    });

    //preserve promise of .fields() call
    quoteFieldsPromise = Quote.fields().$promise.then(function(fields) {
        //inner code is as is 
        //below lines are only changed.

        Quote.status = quoteStatus;
        Quote.language = quoteLanguage;
    });

    var getQuoteDetails = function() {
        return $q.when(quoteFieldsPromise).then(function() {
            return {
                quoteStatus: quoteStatus,
                quoteLanguage: quoteLanguage
            };
        })
    };

    return {
        QuoteApi: QuoteApi,
        getQuoteDetails: getQuoteDetails
    };
});

контроллер

Quote.getQuoteDetails().then(function(quoteDetails){
    $scope.quoteStatus = quoteDetails.quoteStatus;
    $scope.quoteStatus = quoteDetails.quoteLanguage;
});
  • 0
    Спасибо Pankaj, но как я могу использовать getQuoteDetails в моем контроллере? Я попытался установить его как: Quote.prototype.quoteFields = function(){} в моем factory.js, но все еще кажется неопределенным.
  • 0
    @GustavoReyes вы смотрели обновленный ответ?
Показать ещё 3 комментария

Ещё вопросы

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