116 votes

Nested Models in Backbone.js, comment approche

Bonjour, j'ai le JSON suivants fournis à partir d'un serveur. Avec cela, je veux créer un modèle avec un modèle imbriqué. Je ne suis pas sûr de ce qui est moyen pour y parvenir.

//json
[{
    name : "example",
    layout : {
        x : 100,
        y : 100,
    }
}]

Je veux être converti en deux imbriqués épine dorsale des modèles avec la structure suivante:

// structure
Image
    Layout
...

J'ai donc définir le modèle de Mise en page comme ceci:

var Layout = Backbone.Model.extend({});

Mais lequel des deux (le cas échéant) les techniques ci-dessous devrais-je utiliser pour définir le modèle de l'Image? A ou B ci-dessous...

Un

var Image = Backbone.Model.extend({
    initialize: function() {
        this.set({ 'layout' : new Layout(this.get('layout')) })
    }
});

ou, B

var Image = Backbone.Model.extend({
    initialize: function() {
        this.layout = new Layout( this.get('layout') );
    }
});

98voto

rycfung Points 835

J'ai le même problème alors que je suis en train d'écrire mon épine Dorsale de l'application. Avoir à traiter avec embedded/modèles imbriqués. J'ai fait quelques réglages que je pensais était un très élégante solution.

Oui, vous pouvez modifier la méthode d'analyse de changer les attributs autour de l'objet, mais tout cela est en fait assez difficile à maintenir du code de l'OMI, et se sent de plus de un hack qu'une solution.

Voici ce que je propose pour votre exemple:

D'abord définir votre Modèle de Mise en page comme si.

var layoutModel = Backbone.Model.extend({});

Alors voici une image du Modèle:

var imageModel = Backbone.Model.extend({

    model: {
        layout: layoutModel,
    },

    parse: function(response){
        for(var key in this.model)
        {
            var embeddedClass = this.model[key];
            var embeddedData = response[key];
            response[key] = new embeddedClass(embeddedData, {parse:true});
        }
        return response;
    }
});

Notez que je n'ai pas falsifié avec le modèle lui-même, mais simplement de passer de nouveau l'objet désiré à partir de la méthode d'analyse.

Cela devrait s'assurer que la structure de la imbriquée modèle lorsque vous êtes en train de lire à partir du serveur. Maintenant, vous pouvez remarquer que l'enregistrement ou le réglage n'est pas réellement traitée ici, parce que je pense qu'il fait sens pour vous de définir le modèle imbriqué explicitement en utilisant le bon modèle.

Comme suit: image.set({layout : new Layout({x: 100, y: 100})})

Aussi, prenez note que vous êtes réellement appeler la méthode parse dans votre imbriquée modèle en appelant:

new embeddedClass(embeddedData, {parse:true});

Vous pouvez définir autant de modèles imbriqués dans l' model domaine que vous avez besoin.

Bien sûr, si vous voulez aller aussi loin que l'enregistrement du modèle imbriqué dans sa propre table. Ce ne serait pas suffisant. Mais dans le cas de la lecture et de l'enregistrement de l'objet dans son ensemble, cette solution devrait suffire.

16voto

Eric Hu Points 7388

Je poste ce code à titre d’exemple de suggestion de Peter Lyon à redéfinir l’analyse. J’ai eu la même question et cela a fonctionné pour moi (avec un backend de Rails). Ce code est écrit en Coffeescript. J’ai fait quelques petites choses explicite pour les personnes peu familier avec elle.

11voto

Peter Lyons Points 47794

Je ne suis pas sûr de la Dorsale elle-même a une méthode recommandée pour ce faire. L'objet de Mise en page avoir son propre IDENTIFIANT et enregistrement dans la base? Si oui, vous pouvez en faire son propre Modèle que vous avez. Si pas, vous pouvez laisser une imbriqués document, assurez-vous de le convertir et de JSON correctement dans l' save et parse méthodes. Si vous ne finissent par prendre une approche de ce genre, je pense que votre Un exemple est plus compatible avec la dorsale depuis set sera correctement mise à jour de attributes, mais encore une fois je ne suis pas sûr de ce que la Dorsale ne avec des modèles imbriqués par défaut. Il est probable que vous aurez besoin d'un certain code personnalisé pour gérer cela.

11voto

Jaynti Kanani Points 193

Utilisation `` de la colonne vertébrale-associations :

8voto

philfreo Points 12382

J’irais avec Option B si vous voulez garder les choses simples.

Une autre bonne option serait d’utiliser Relationnel d’épine dorsale. Vous devez simplement définir quelque chose comme :

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X