2012-07-18 4 views
0

Je ne peux pas faire fonctionner le code suivant dans mon application de test:Tri un tableau ne met pas à jour le Dom

this.propertyWillChange('tableContent'); 
this.get('tableContent').sort(function (a, b) { 
    var nameA = a.artikel_name, 
    nameB = b.artikel_name; 
    if (nameA < nameB) { 
     return -1; 
    } 
    if (nameA > nameB) { 
     return 1; 
     } 
     return 0 //default return value (no sorting) 
    }); 
this.propertyDidChange('tableContent'); 

Les données se triée, mais le dom est pas mis à jour.

Le modèle ressemble à ceci:

<tbody> 
    {{#each NewApp.router.gridController.tableContent}} 
     {{#view NewApp.TableRow rowBinding="this"}} 
      <td style="width: 100px">{{view.row.product_no}}</td> 
      <td align="right" style="width: 100px">{{view.row.price}}</td> 
      <td>{{view.row.artikel_name}}</td> 
     {{/view}} 
    {{/each}} 
</tbody> 

J'ai essayé de reproduire ce problème avec un court extrait jsFiddle. Mais là ça marche. La seule différence est que je récupère les données en utilisant un appel ajax (et une configuration supplémentaire du routeur).

selectionChanged: function() { 
    var that = this; 
    if (this.selection) { 
    $.getJSON("api/v1/lists/" + this.selection.id + "/prices", function (content) { 
     that.set('tableContent', content); 
    }); 
} 
}.observes('selection') 

Le même code fonctionne si je copie le tableau et réaffecte le tableau copié.

+1

Pouvez-vous fournir un jsFiddle? Il est possible de simuler un appel AJAX, donc ce cas devrait être possible de démontrer dans un violon ... – pangratz

+0

[JSFiddle] (http://jsfiddle.net/rogergl/PY7Hr/22/) - Mais je n'ai pas de données publiques disponibles simuler l'appel ajax. – rogergl

Répondre

1

Avez-vous essayé d'utiliser le SortableMixin intégré? Si non, est-ce bon pour vous?

JavaScript:

App = Ember.Application.create(); 

App.activities = Ember.ArrayController.create({ 
    content: [{name: 'sleeping'}, {name: 'eating pizza'}, 
      {name: 'programming'}, {name: 'looking at lolcats'}], 
    sortProperties: ['name'] 
}); 

App.ActivityView = Ember.View.extend({ 
    tagName: "li", 
    template: Ember.Handlebars.compile("{{content}}") 
}); 

App.SortButton = Ember.View.extend({ 
    tagName: "button", 
    template: Ember.Handlebars.compile("Sort"), 
    click: function() { 
    App.activities.toggleProperty('sortAscending'); 
    } 
}); 

jsFiddle: http://jsfiddle.net/Sly7/cd24n/#base

+0

incroyablement simple! – MilkyWayJoe

+0

@MilkyWayJoe yep, mais je vais attendre rogergl pour voir si cela fonctionne pour son application :) –

+0

Je ne sais pas si cela va fonctionner pour son implémentation particulière, car il utilise une propriété pour regarder les changements dans la collection, mais la propriété est changée à la même valeur 'newOrder' le bouton est cliqué donc il tire la méthode 'sort' dans le contrôleur, mais il ne se re-set, donc il me semble que la méthode' sort' ne se déclenche qu'une seule fois depuis le la prochaine fois qu'elle changera la valeur de cette propriété, elle aura la même valeur que précédemment. Ai-je tort? Je pense qu'il devrait utiliser votre mise en œuvre, semble beaucoup plus propre et fait le travail – MilkyWayJoe