2016-07-19 30 views
-1

Ich versuche einen Datensatz im Ember-Speicher zu aktualisieren. Wenn ich versuche, dies zu tun, gibt es den folgenden Fehler:Der Inhalt ist nicht definiert, wenn ich versuche, mit einem Datensatz in Ember zu arbeiten.

Uncaught Error: Assertion Failed: Cannot delegate set('name', test) to the 'content' property of object proxy : its 'content' is undefined.

Der Controller sieht wie folgt aus:

import Ember from 'ember'; 

export default Ember.Controller.extend({ 
    model: null, 
    event: { 
    name: "test", 
    id: "adfg8943224xcvsdf" 
    }, 
    actions: { 
    editEvent (event) { 
     var Event = this.store.find('event', event.id); 

     Event.set('name', event.name); 
     Event.save() 
    } 
    } 
}); 

Die Route sieht wie folgt aus:

import Ember from 'ember'; 

export default Ember.Route.extend(AuthenticatedRouteMixin, { 
    model() { 
    return { 
     event: this.store.find('event') 
    } 
    }, 
    setupController (controller, model) { 
    controller.set('model', model); 
    } 
}); 

Die Vorlage löst die Aktion, Senden eines Objekts namens Ereignis, das Eigenschaften wie Name und ID hat. Die Werte des Ereignisobjekts von der Steuerung kommen und gesetzt wurden die editEvent Aktion vor dem Auslösen:

<form {{action 'editEvent' event on="submit"}}> 
+1

Nicht 'find' ein Versprechen zurückzukehren? Bitte zeigen Sie uns auch den Template-Code, insbesondere den Teil, wo Sie die 'editEvent'-Aktion aufrufen - was genau ist' event'? –

+0

Find gibt eine Klasse mit einer Inhaltsklasse zurück. Event ist ein Objekt mit Eigenschaften wie Name und ID. –

+0

Wollten Sie einen POJO aus dem Modell-Hook zurückgeben? Normalerweise würden Sie ein Versprechen abgeben. Warum wickelst du die 'store.find' in ein solches Objekt? Versuchen Sie, mehrere Modelle zu laden? – Sarus

Antwort

0

Ich glaube, was passiert ist, dass Ihr model Haken eine POJO zurückkehrt, die ein Versprechen enthält, die behoben wird. Falls Sie Fragen zu Ihrer Aktion übergeben wollen, dann müssen Sie

<form {{action 'editEvent' model.event on="submit"}}> 

tun, dass gesagt wird, sollten Sie wirklich nur ein Versprechen von Ihrem model Haken zurückkehren, so dass Ember warten für Ihre Daten vor dem Rendern die Vorlage zu laden. Bei der Art und Weise, wie Sie es jetzt eingerichtet haben, kann jemand, wenn Ihre Daten viel Zeit zum Laden benötigen, das Formular abschicken, bevor das Modell geladen wird, und Sie erhalten einen Fehler.

Ich glaube, Sie wollen Ihre Route wie folgt aus (keine Notwendigkeit setupController außer Kraft zu setzen) suchen:

import Ember from 'ember'; 

export default Ember.Route.extend(AuthenticatedRouteMixin, { 
    model() { 
    return this.store.find('event');   
    } 
}); 

Dann in Ihrer Vorlage:

<form {{action 'editEvent' model on="submit"}}> 

Wenn Sie mehrere Modelle laden müssen dann sollte Ember.RSVP.hash verwenden.

Siehe diese Antwort: EmberJS: How to load multiple models on the same route?

Auch ich bin nicht ganz sicher, was Ihre Aktion versucht erneut, den Datensatz zu tun, aber Sie brauchen nicht zu finden. Der Code, den Sie für Ihre Aktion gepostet haben, tut eigentlich nichts. Es ruft das Ereignis ab und setzt den Namen des Ereignisses auf seinen eigenen Namen.

actions: { 
    editEvent (event) { 
     // you already have the event, you passed it in as a parameter 
     // you don't need to query the store again for it. 
     var Event = this.store.find('event', event.id); 

     // This doesn't do anything as it just sets the event.name to itself 
     Event.set('name', event.name); 
     Event.save() 
    } 
    } 

Ich glaube, Sie, dies zu tun bedeuten:

actions: { 
    editEvent (event) { 
     event.set('name', 'updated name'); 
     event.save(); 
    } 
    }