12
votes

Attributs non persistants dans Emberjs

Est-ce que quelqu'un connaît-il un moyen de spécifier pour un modèle un attribut qui n'est pas persisté?

Fondamentalement, nous chargons des métadonnées liées à chaque modèle et envoient ces données à Ember via le restadapter dans le modèle. Ces métadonnées peuvent être modifiées dans notre application, mais se fait via à l'aide d'un appel Ajax. Une fois que l'appel réussit, je souhaite pouvoir mettre à jour cette valeur dans le modèle sans embouts qui collent son nez dans cette entreprise en modifiant le modèle au non engagé et faisant ce qu'il fait avec transactions < / code> dans les coulisses.

J'ai aussi le problème que cette métadonnée, qui n'est pas des données de l'enregistrement de base de données , est passée par le Restadapter retour sur le serveur, ce qui ne fait pas 't attend ces valeurs. J'utilise un backend Ror, donc les erreurs de serveur en essayant d'attribuer des attributs protégés de masse qui ne sont pas censés être des attributs du tout. Je sais que je peux frotter les données reçues sur le serveur, mais je préférerais que le client puisse distinguer les données persistantes et les données auxiliaires.

Ainsi, à la question originale: Y a-t-il une alternative au ds.attr ("..." de l'EMBER-DATA ("...") qui spécifiera un attribut non persistant?


1 commentaires

4 Réponses :


6
votes

Quand ce PR Obtenez la fusion, il sera possible de signaler des propriétés comme Readonly code>. Mais jusqu'à ce qu'il y ait des solutions de contournement à cela, par exemple Remplacement de votre méthode code> Addattributes CODE> dans l'adaptateur et faites-la affaire avec vos propriétés spéciales, voici un exemple de la façon dont cela pourrait ressembler à:

Définissez votre modèle en ajoutant la nouvelle option Readonly code>: p> xxx pré>

puis sur l'adaptateur: p>

App.Serializer = DS.RESTSerializer.extend({
   addAttributes: function(data, record) {
     record.eachAttribute(function(name, attribute) {
       if (!attribute.options.readOnly) {
         this._addAttribute(data, record, name, attribute.type);
       }
     }, this);
   }
 });


3 commentaires

Beau, j'aurais dû être capable de trouver cela via Google, mon mauvais. J'ai passé tellement de temps à regarder! Il semble que cela entraînera toujours la saleté du modèle, alors je vais devoir travailler autour de cela encore, mais cela résout la partie la plus difficile du problème. Merci!


Merci. Cela devrait aller dans leur source. Bien que transitoire sonne comme un meilleur ajustement que lisonly


Ember-Data version 1.0 Beta a tué ceci. Toute solution alternative?



1
votes

Mise à jour

Cette réponse est probablement obsolète avec les versions actuelles des données Ember. Je n'utiliserais rien dans ma réponse.


Je réponds à cette question pour référence, et parce que votre commentaire a indiqué que l'enregistrement reste isdirty , mais voici ici Ma solution pour lecture seule , non persistante attributes non sale non sale.

Remplacer le Advatrebutes Méthode dans votre sérialisateur empêche Lisonly d'être envoyé sur le serveur, ce qui est probablement exactement ce que vous voulez, mais vous devez étendre (ou rouvrer ) votre Adaptateur pour remplacer le DirtyRecordsforattributechange Pour éviter que l'enregistrement de devenir sale: xxx

alors vous pouvez utiliser les attributs : xxx

Cette configuration fonctionne pour moi.


0 commentaires

13
votes

Les autres réponses à cette question fonctionnent avec des versions de données Ember jusqu'à 0,13 et ne fonctionnent plus. Pour Ember Data 1.0 Beta 3 Strong> Vous pouvez faire:

App.User = DS.Model.extend({
  name: DS.attr('string', {transient: true})
});


2 commentaires

Est-ce toujours le cas? C'est une excellente solution, mais la réponse est assez ancienne, le framework a-t-il absorbé maintenant?


Cette version est la dernière que j'ai utilisée, mais théoriquement, cela devrait fonctionner, car l'équipe a déclaré qu'ils gelaient des changements d'API après 1.0



6
votes

Suivre cette Répondre , pour empêcher un champ d'être sérialisé, remplacez le sérialisateur par défaut pour votre modèle:

Dans App / Serializers / Person.js Code>: P>

export default DS.JSONSerializer.extend({
  attrs: {
    admin: { serialize: false }
  }
});


2 commentaires

Serialize: FALSE fonctionne parfaitement avec ds.restserializer (Ember-Data V1.0.0-BETA.16.1).


C'est la solution la plus "correcte" recommandée. Voir également: Comment prévenir les données Ember à partir de l'attribut d'enregistrement (c.-à-d. Attribut en lecture seule) .