2016-03-04 3 views
0

У меня есть коллекция 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. Я предполагаю, что что-то не так с обещаниями, но не уверен. Любая помощь? Заранее спасибо.

ответ

0

Вы можете обернуть логику, которая извлекает страну в функции. Таким образом, функция сохраняет правильную ссылку на buffer без влияния изменения i:

// 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; 
    function setCountryName(buffer){ 

    // queries countries collection passing country_id 
    var Country = Restangular.one('countries', buffer.countryId); 

    Country.get().then(function(country) { 
     // sets country name for temp object based on country_id 
     buffer.country = country.name; 
    }); 
    return buffer; 
    } 

    // 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 
    }; 

     // pushes buffer to $scope.allCompanies 
     $scope.allCompanies.push(setCountryName(buffer)); 
    }; 
+0

работает отлично! можете ли вы объяснить немного больше, почему мой код не работал? Я не на 100% понимаю это. –

+1

Ваш цикл менял значение 'i' до того, как запрос в' страны 'был завершен (так как он асинхронен). Это привело к тому, что ссылка «buffer» изменилась перед ответом, и обещание затем обновило бы другую переменную 'buffer'. Это привело к смешным результатам. Сделав код, вызывающий «страны», сохраните ссылку, вы можете избежать этого. –