Я пытаюсь переместить всю бизнес-логику с моего контроллера на завод, но у меня есть некоторые проблемы с передачей данных полей.
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 не определен. Что мне не хватает?
Заранее спасибо.
Вы не можете ожидать, что операция 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;
});
getQuoteDetails
в моем контроллере? Я попытался установить его как:Quote.prototype.quoteFields = function(){}
в моем factory.js, но все еще кажется неопределенным.