2013-03-24 24 views
11

URL/#/kişi/1 işlenirken yalnızca kişinin verilerini değil, aynı zamanda o kişinin telefon numaralarını işlemek için aşağıdaki örnek kodu nasıl edinebilirim? Telefon numaralarını {{#each phoneNumber in phoneNumbers}} numaralı telefondan aramaya çalışıyorum ama benim tarafımda temel bir anlayış hatası olmalı.Micül ilişki verileri nasıl oluşturulur?

Şu anda sadece olsun:

enter image description here

app.js

App = Ember.Application.create({ 
    LOG_TRANSITIONS: true, 
    rootElement: '#container' 
}); 

// Router 
App.Router.map(function() { 
    this.resource('persons', function() { 
    this.resource('person', { path: ':person_id' }); 
    }); 
    this.resource('phoneNumbers', function() { 
    this.resource('phoneNumber', { path: ':phone_number_id' }); 
    }); 
}); 

App.PersonsRoute = Ember.Route.extend({ 
    model: function() { 
    return App.Person.find(); 
    } 
}); 

App.PhoneNumbersRoute = Ember.Route.extend({ 
    model: function() { 
    return App.PhoneNumber.find(); 
    } 
}); 

// Models 
App.Store = DS.Store.extend({ 
    revision: 11, 
    adapter: 'DS.FixtureAdapter' 
}); 

App.Person = DS.Model.extend({ 
    firstName: DS.attr('string'), 
    lastName: DS.attr('string'), 
    phoneNumbers: DS.hasMany('App.PhoneNumber') 
}); 

App.PhoneNumber = DS.Model.extend({ 
    number: DS.attr('string'), 
    person: DS.belongsTo('App.Person') 
}); 

App.Person.FIXTURES = [{ 
    id: 1, 
    firstName: 'X', 
    lastName: 'Smith' 
}, { 
    id: 2, 
    firstName: 'Y', 
    lastName: 'Smith' 
}]; 

App.PhoneNumber.FIXTURES = [{ 
    id: 1, 
    person_id: 1, 
    number: '20' 
}, { 
    id: 2, 
    person_id: 1, 
    number: '23' 
}, { 
    id: 3, 
    person_id: 2, 
    number: '42' 
}]; 

index.html bu ActiveRecord gibi hareket etmez

<!DOCTYPE html> 
<html lang="en"> 
    <head> 
    <title>Phone book</title> 
    </head> 
    <body> 
    <div id='container'></div> 

    <script type="text/x-handlebars" data-template-name="application"> 
     {{outlet}} 
    </script> 

    <script type="text/x-handlebars" data-template-name="persons"> 
     <p>All people:</p> 
     <ul> 
     {{#each controller}} 
      <li>{{firstName}} {{lastName}}</li> 
     {{/each}} 
     </ul> 
     {{outlet}} 
    </script> 

    <script type="text/x-handlebars" data-template-name="person"> 
     <h1>{{firstName}} {{lastName}}</h1> 
     {{#if phoneNumbers.length}} 
     <ul> 
      {{#each phoneNumber in phoneNumbers}} 
      <li>{{phoneNumber.number}}</li> 
      {{/each}} 
     </ul> 
     {{/if}} 
    </script> 

    <script type="text/x-handlebars" data-template-name="phone_numbers"> 
     <ul> 
     {{#each controller}} 
      <li>{{number}}</li> 
     {{/each}} 
     </ul> 
     {{outlet}} 
    </script> 

    <script type="text/x-handlebars" data-template-name="phone_number"> 
     <h1>{{number}}</h1> 
    </script>  

    </body> 
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script> 
    <script type="text/javascript" src="js/handlebars.js"></script> 
    <script type="text/javascript" src="js/ember.js"></script> 
    <script type="text/javascript" src="js/ember-data.js"></script> 
    <script type="text/javascript" src="js/app.js"></script> 
</html> 

cevap

8

Kor-veri dikkat: has_many'u kullandığınızda bir mülke sahip olmanız gerekir. kayıtlar için id s dizisidir. Karşılıklı modelde sahip için yabancı bir anahtar olması yeterli değildir.

, ilk Person fikstürünüzü phoneNumbers: [1, 2] eklemeye ve saniyeye phoneNumbers: [3] eklemeyi deneyin.

RESTAdapter'ı kullanıyorsanız, bu anahtar adlar phone_number_ids olur. active_model_serializers kullanırsanız, otomatik olarak bir dizi kimlik eklemek için embed özelliğini kullanabilirsiniz. # Için bir fark yapmadığını aşağıdaki koda armatürü değiştirme

+1

/kişi/1 App.Person.FIXTURES = [{ id: 1, firstName: 'X', lastName: 'Smith', phone_number_ids: [1, 2] ' }, { id: 2, firstName: ' Y', velastName:' Smith, phone_number_ids: [3] }]; App.PhoneNumber.FIXTURES = [{ id: 1, person_id: 1, sayısı: '20' }, { id: 2, person_id: 1, No: 23 '' }, { no: 3, person_id: 2, no: '42' }]; – wintermeyer

+0

Ah, tamam FixtureSerializer biraz farklı çalışır. Bunları 'phoneNumbers: [1, 2] 'olarak değiştirin. –

+1

Bingo! Teşekkür ederim. – wintermeyer