0

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

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 является неопределенным. Что мне не хватает?

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

ответ

2

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

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

Я думаю, вы должны ввести флаг $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

Благодаря Панкай, но как я могу использовать 'getQuoteDetails' в мой контроллер? Я пробовал установить его так: 'Quote.prototype.quoteFields = function() {}' в моей factory.js, но все еще не определен. –

+0

@ GustavoReyes Вы просмотрели обновленный ответ? –

+0

Просто сделал. Благодаря! –

Смежные вопросы