2012-07-30 12 views
6

Um eine kleine gelbe "Speichern"/"Gespeichert" -Anzeige am oberen Rand meiner App zu erstellen, hätte ich gerne eine boolesche Eigenschaft, die if anzeigt Alle Glutendatensätze befinden sich derzeit im Flug.ember-data: Wie man eine Flash-Nachricht speichert/speichert

Ich versuchte dies:

App.store = DS.Store.create 
    isSaving: (-> 
    for record in this.get('recordCache') 
     if record?.getPath('stateManager.currentState.name') == 'inFlight' 
     return true 
    return false 
).property('[email protected]') 

aber dann entdeckte ich, dass recordCache nicht beobachtbar ist.

Ich verwende keine Transaktionen, nur App.store.commit(), so sah ich App.store.get('defaultTransaction'), aber es ergab nichts nützliches.

Ich benutze den RESTAdapter, also wenn ich es erweitern könnte, um mir diese Information zu geben, würde das auch funktionieren.

+0

Ist defaultTransaction.buckets.inflight beobachtbar? –

+0

Haben Sie jemals etwas herausgefunden? Ich habe eine Lösung für eine App, die ich gerade erstelle, aber ich mag sie nicht. Es erweitert die DS.Model-Klasse und legt die Eigenschaft didUpdate() fest, um beim Speichern eines Modells eine Benachrichtigung auszulösen. –

+0

Nein, habe ich nicht. Warum postest du deine Lösung nicht als Antwort, auch wenn es eine Lücke ist? –

Antwort

2

Nun, Sie könnten einfach ein Basismodell mit einer didupdate -Eigenschaft erstellen, die die Anzeige Ihrer Benachrichtigung verarbeitet, und dann von jedem Ihrer Modelle erweitern lassen. Es ist wirklich eine Notlösung, aber es funktioniert einstweilen:

App.Model = DS.Model.extend 
    didUpdate: -> 
     # invoke your notification 
     alert("All changes saved!") 

App.User = App.Model.extend() 

aber .... das für jeden Datensatz ausgelöst wird, die aktualisiert wird. Daher solltest du deine Benachrichtigungsklasse wahrscheinlich so erstellen, dass nicht mehr als eine gespeicherte Benachrichtigung gleichzeitig geöffnet wird ... aber das liegt an dir.

Ich arbeite derzeit an der Implementierung einiger der grundlegenden Server-Validierungsmethoden aus dieser Pull-Anforderung https://github.com/emberjs/data/pull/376, und ich hoffe, dass ich eine bessere Möglichkeit finden werde, den Status der Commits (und Willen von Natürlich posten Sie hier, wenn ich das tue).

4

Warum erstreckt sich nicht Modell, Controller und/oder Ansicht:

DS.Model.reopen({ 
    didCreate: function() { 
     this.set('persisted', true); 
    }, 
    didUpdate: function() { 
     this.set('persisted', true);  
    }, 

    resetPersistenceFlag: function(){ 
     this.set('persisted', false); 
    }.observes('isDirty') 

}); 

Ember.Controller.reopen({ 
    contentPersistedObserver: function() { 
     if (this.get('content.persisted') === true) { 
      //do stuff here 
     } 
    }.observes('content.persisted') 
}); 

Ember.View.reopen({ 
    controllerContentPersistedObserver: function() { 
     if (this.get('controller.content.persisted') === true) { 
      //do stuff here 
     } 
    }.observes('controller.content.persisted') 
});​ 

Auf diese Weise Ihren Controller/Ansicht wissen, wann Modell gespeichert wird. Es wird für Create/Update-Controller ausgelöst, aber für Controller, die Arrays verwalten, wird es nicht funktionieren.

+0

Ich mag das eigentlich sehr, und bringt die Dinge zurück in den Controller, wo sie hingehören. Könnte fast anfangen, einfache Fehlerbehandlung auch zu machen. Noch wird das Problem haben, wo der Controller für jeden Datensatz, der aktualisiert wird, feuern wird ... also in meinem Fall, wenn ich 10 Datensätze auf einmal aktualisiert habe, bekomme ich 10 Alarmfenster ... aber das ist außerhalb des Bereichs dieser Frage, denke ich . –

+0

Das ist ein bisschen falsch, didCreate wird sofort ausgelöst und bedeutet nicht dauerhaft. didUpdate ist alles was Sie brauchen um persistent auf true zu setzen. – jhorman

0

Es gibt eine viel einfachere Lösung dieses Problems.

App.MyView = Ember.View.extend({ 

    init: function() { 
     this._super(); 
     var self = this; 
     this.get('controller').content.on('didUpdate', function() { 
      self.SomeCoolUpdateFunctionForMyView(self.$()); 
     }); 
    } 
}); 

Selbst $() Verweise auf die jquery Darstellung Ihrer Ansicht.