2017-06-06 1 views
1

Nous n'utilisons pas Ember-Data dans notre projet. Nous avons un scénario dans lequel chaque modèle a un identifiant d'un autre modèle de type. En fait, nous n'avons pas de modèles aussi. Nous utilisons Ajax simple.Relations d'objet dans Ember sans utiliser Ember-Data

Prenons 2 modèles Test et application. Un test contiendra l'identifiant de l'application pour lequel ce test a été créé. Lorsque je récupère un test, je veux également les données de l'application. Ember-Data le fait par défaut lorsque nous utilisons des relations. Comment puis-je y parvenir sans Ember-Data? Il pourrait y avoir 2 tests pour la même application. Une fois les données d'application récupérées, je ne souhaite plus effectuer de demande pour les mêmes données d'application.

Répondre

0

Ma réponse - créez votre propre magasin en mémoire (Le service ressemble à la solution Ember-way) pour stocker les enregistrements déjà chargés. Par exemple, il pourrait avoir une structure comme ceci:

// app/services/store.js 

export default Ember.Service.extend({ 
    ajax: Ember.inject.service(), 

    store: { 
     applications: [], 
     tests: [] 
    }, 

    getTest(id) { 
     const store = this.get('store'); 

     return new Ember.RSVP.Promise(resolve => { 
      const loadedTest = store.tests.findBy('id', id); 
      if (loadedTest) { 
       return resolve(loadedTest); 
      } 

      this.get('ajax').getRequest(urlForGettingTestWithConcreteId).then(test => { 
       if (test.application) { 
        const application = store.applications.findBy('id', test.application); 

        if (application) { 
         test.application = application; 

         store.tests.pushObject(test); 

         return resolve(test); 
        } 

        this.get('ajax').getRequest(test.application).then(application => { 
         test.application = application; 

         store.applications.pushObject(application);       
         store.tests.pushObject(test); 

         resolve(test); 
        }); 
       } 
      }); 
     }); 
    } 
}); 

Il est pseudo-code mixte et le code qui devrait fonctionner, mais vous devriez facilement le faire fonctionner avec votre application. :)