У меня есть коллекция companies
с полем country_id
, которая ссылается на _id
в коллекции countries
.Как моделировать отношения один к одному в AngularJS с Restangular
Companies
следующим образом:
{
name: "acme",
address: "zossener straße 123",
postalCode: "10961",
city: "berlin",
country_id: "56d58d68ab68b5cf3f72788e"
}
Countries
следующим образом:
{
_id: "56d58d68ab68b5cf3f72788e",
name: "Germany"
}
То, что я пытаюсь сделать, это заменить country_id
из Companies
в Countries.name
. Поэтому для каждой компании я хочу название страны, а не идентификатор страны. Я использую Restangular. Мой контроллер:
// creates a Restangular object of the 'companies' endpoint for later use
var Companies = Restangular.all('companies');
// for later pushing the countries
$scope.allCompanies = [];
// queries companies collection
Companies.getList().then(function(companies) {
$scope.companies = companies;
// iterates each company to get the country name
for (var i = 0; i < $scope.companies.length; i++) {
// prepares temp object to be pushed to $scope.allCompanies
var buffer = {
name: $scope.companies[i].name,
address: $scope.companies[i].address,
postalCode: $scope.companies[i].postalCode,
city: $scope.companies[i].city,
countryId: $scope.companies[i].country_id
};
// queries countries collection passing country_id
var Country = Restangular.one('countries', $scope.companies[i].country_id);
Country.get().then(function(country) {
// sets country name for temp object based on country_id
buffer.country = country.name;
// pushes buffer to $scope.allCompanies
$scope.allCompanies.push(buffer);
});
};
При запуске, $scope.allCompanies
показывает все компании только одна страна, которая является последней страной, присваивается buffer
. Я предполагаю, что что-то не так с обещаниями, но не уверен. Любая помощь? Заранее спасибо.
работает отлично! можете ли вы объяснить немного больше, почему мой код не работал? Я не на 100% понимаю это. –
Ваш цикл менял значение 'i' до того, как запрос в' страны 'был завершен (так как он асинхронен). Это привело к тому, что ссылка «buffer» изменилась перед ответом, и обещание затем обновило бы другую переменную 'buffer'. Это привело к смешным результатам. Сделав код, вызывающий «страны», сохраните ссылку, вы можете избежать этого. –