5 votes

Remplissage du contenu de la vue Ember.Select à partir de RecordArray récupéré à l'aide d'Ember-data

J'ai une liste de sélection qui est créée en utilisant ce code :

      {{view Ember.Select
      contentBinding="App.riskCategories"
      optionValuePath="content.id"
      optionLabelPath="content.name"
      selectionBinding="riskCategory"
      class="input-medium"}}

catégorie de risque est une propriété de l App.Facility chargé pour le modèle et la liste des App.RiskCategory est remplie avec ce code :

App.ready = function() {
  App.riskCategories = App.RiskCategory.all()
}

Cela fonctionne bien et alimente la liste de sélection, mais uniquement avec le sous-ensemble de catégories de risque déjà chargé dans le navigateur. Si j'appelle App.RiskCategory.find() à partir de la console du navigateur, le reste est chargé et la liste de sélection est mise à jour. Cependant, je n'arrive pas à faire fonctionner le code pour qu'il fasse cela pour moi.

Alors j'ai essayé :

App.ready = function() {
  App.riskCategories = App.RiskCategory.find()
}

ou :

App.ready = function() {
  App.RiskCategory.find()
  App.riskCategories = App.RiskCategory.all()
}

Mais ces deux méthodes donnent lieu à l'erreur suivante :

Uncaught Error: Attempted to handle event `loadedData` on <App.Facility:ember417:1> while in state rootState.loaded.updated.uncommitted. Called with undefined

J'apprécierais toute aide ou suggestion sur une meilleure façon d'alimenter la liste de sélection. Voici App.RiskCategory doivent être considérés comme une collection immuable de constantes stockées dans la base de données. Chacun des objets App.Facility est associé à l'un de ces objets App.RiskCategories

Merci !

3voto

ken Points 2086

Essayez plutôt de définir les catégories dans votre route et d'y accéder dans votre modèle via le contrôleur.

APP.YourRoute = Ember.Route.extend({
    setupController:function(controller,model) {
       this._super(controller,model);
       controller.set('riskCategories',App.RiskCategory.find());
    },  

});  

En supposant que votre vue de sélection se trouve dans le même contexte que le contrôleur, vous pouvez accéder aux catégories dans votre modèle de cette façon :

{{view Ember.Select
  contentBinding="controller.riskCategories"
  optionValuePath="content.id"
  optionLabelPath="content.name"
  selectionBinding="riskCategory"
  class="input-medium"}}

1voto

ianpetzer Points 1116

J'ai résolu ce problème en enveloppant le rendu de chaque App.Facility dans un {{#if isLoaded}}.

Le code ressemblait donc à quelque chose comme :

{{#each client.facilities}}
  {{#if isLoaded}}
    {{view Ember.Select
      contentBinding="App.riskCategories"
      optionValuePath="content.id"
      optionLabelPath="content.name"
      selectionBinding="riskCategory"
      class="input-medium"}}
  {{/if}}
{{/each}}

Il semble que le App.Facility qui définit le App.RiskCategory n'avait pas encore fini de se charger, de sorte que la valeur par défaut de l'option App.RiskCategory était en cours de définition, puis lorsque le dataLoaded était déclenché, l'exception était levée parce que l'objet avait déjà été modifié.

0voto

chopper Points 6349

J'ai eu un problème similaire et la solution utilisant #isLoaded n'a pas fonctionné pour moi. En revanche, j'ai ajouté un prompt à la propriété Ember.Select élément. Je soupçonne que cela a à voir avec l'asynchronisme du rendu de la vue et du chargement des données (dans mon cas à partir de FIXTURES mais pour autant que je sache DS.FixtureAdapter simule les décalages dans le chargement des données).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X