Ember-Ansicht wird nicht aktualisiert nach der erneuten Bestellung array zum erstellen von untergeordneten Ansichten
Habe ich eine Tätigkeit ansehen, die enthält eine Reihe von Aktivitäten. Dieses array wird sortiert, manchmal basierend auf einer berechneten Eigenschaft(distanced_from_home), die der Benutzer aktualisieren kann. Wenn das array sortiert ist, möchte ich das Kind Ansichten neu gerendert, indem nach der neuen Ordnung. Hier ist meine Vorlage und Ansicht:
index.html
<script type="text/x-handlebars" data-template-name="activities">
<h1>Activities</h1>
{{#each activities}}
{{view App.ActivityView activityBinding="this"}}
{{/each}}
</script>
app.js
App.ActivitiesView = Em.View.extend({
templateName: 'activities',
activities: (function() {
var list;
list = App.activityController.activities;
console.log("Activities View");
console.log(list);
return list;
}).property('App.activityController.activities', '[email protected]_to_home').cacheable()
});
Wenn ich die distance_to_home Eigenschaft zu ändern, die Konsole.log-Ausgabe zeigt die Liste array richtig sortiert, aber die Kinder Ansichten sind nicht neu gerendert, in der neuen Ordnung. Wenn ich die Ansicht verlassen und dann comeback (es ist erneut gerendert), dann ist die richtige Reihenfolge gezeigt.
Was sollte ich tun, um die Ansicht zu aktualisieren automatisch?
Dank,
BEARBEITEN
Diese scheint zu funktionieren hier und meine 'Aktivitäten' berechnete Funktion ist definitiv brennen, aber keine Neuordnung der Ansicht... ich habe auch versucht, ein Beobachter, aber die Ergebnisse sind die gleichen.
App.ActivitiesView = Em.View.extend({
templateName: 'activities',
classNames: ['activities rounded shadow'],
homeBinding: 'App.user.home',
activities: [],
homeChanged: (function() {
console.log("homeChanged()");
this.set('activities', App.activityController.activities.sort(this.compare_activities));
return null;
}).observes('home'),
compare_activities: function(a, b) {
var result;
result = 0;
if (App.user.home != null) {
result = a.get('distance_to_home') - b.get('distance_to_home');
}
return result;
},
});
Ich habe auch versucht, um die 'Aktivitäten' - parameter ein leeres array und dann setzen Sie es auf die bestellten array zu zwingen, es neu zu Rendern, aber das hat keine Wirkung.
App.ActivitiesView = Em.View.extend({
templateName: 'activities',
classNames: ['activities rounded shadow'],
homeBinding: 'App.user.home',
activities: [],
homeChanged: (function() {
console.log("homeChanged()");
this.set('activities', []);
this.set('activities', App.activityController.activities.sort(this.compare_activities));
return null;
}).observes('home'),
compare_activities: function(a, b) {
var result;
result = 0;
if (App.user.home != null) {
result = a.get('distance_to_home') - b.get('distance_to_home');
}
return result;
},
});
EDIT (die zweite)
So scheint es, dass die Verwendung von Ember.kopieren Sie endlich dies Problem gelöst. Einstellung der array-Eigenschaft auf einen leeren array ein (oder null) hatte keinen Effekt. Hier ist der code Anzeigen, dass endlich gearbeitet:
App.ActivitiesView = Em.View.extend({
templateName: 'activities',
classNames: ['activities rounded shadow'],
homeBinding: 'App.user.home',
activities: [],
homeChanged: (function() {
var list;
list = App.activityController.activities.sort(this.compare_activities);
this.set('activities', Ember.copy(list), true);
return null;
}).observes('home'),
compare_activities: function(a, b) {
var result;
result = 0;
if (App.user.home != null) {
result = a.get('distance_to_home') - b.get('distance_to_home');
}
return result;
}
});
- Können Sie ein JSFiddle mit Beispiel-Daten? Ich denke, die
Ember.copy
ist nicht die beste Lösung. Auch haben Sie einen Blick auf die vor kurzem eingeführtarrangedContent
[github.com/emberjs/ember.js/blob/...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Funktioniert diese Hilfe? http://jsfiddle.net/rNzcy/
Zusammenstellung dieses einfache Beispiel, war ich ein wenig verwirrt, warum das view-update nicht "nur" funktionieren, wenn die Sortierung der Inhalte array in dem ArrayController. Es scheint, es gibt 2 einfache Dinge, die Sie tun können, um trigger, der die Ansicht aktualisiert werden. Entweder:
oder
Ich denke, Ember erkennt, wenn ein komplett neues Array-Objekt gesetzt ist, und löst alle erwarteten Bindung/Aktualisierungen anzuzeigen. Sonst, vielleicht es ist dabei eine Art von caching und wenn das Array-Objekt nicht ändern (D. H. es ist sortiert in-place), dann werden keine Bindungen Feuer? Nur raten.
UPDATE:
Siehe Diskussion @ https://github.com/emberjs/ember.js/issues/575#issuecomment-4397658, die hat eine bessere Problemumgehung verwenden propertyWillChange() und propertyDidChange() (http://jsfiddle.net/rNzcy/4/) -- sollte viel effektiver als das Klonen einer großen Auswahl.
Traf ich das gleiche Problem. Und ich glaube nicht beobachten
array.@each
oderarray.length
ist gute Praxis. Endlich fand ich diese http://jsfiddle.net/rNzcy/4/ d.h. Anrufthis.propertyDidChange('foo')