2013-04-12 5 views
7

Dopo un'altra lunga ricerca, sth esce :-) Sembra che il problema riguardi la funzione "getObjectByName". Non può funzionare bene con requireJS (ADM). Attualmente, devo installare un globel var per risolvere il problema. Sono sicuro che ci deve essere una soluzione migliore.Come rendere Backbone-Relational (0.8.5) funziona con RequireJS?

Qui è la mia temperatura soluton:

(1) installare una var globale e impostare la ricerca di modello di libero sviluppo del globale ("APP")

var APP = {}; 

define(['backbone-relational'], function(){ 
    Backbone.Relational.store.addModelScope(APP); 
}) 

(2) esportare il modello di relazione con the global

APP.YourRelationalModel = YourRelationModel; 

Funziona, non va bene però ... Non vedo davvero l'ora di una risposta migliore. Grazie.

versioni // ------------

prova:

1.Backbone-Relational 0.8.5 
2.Backbone 1.0.0 and Underscore 1.4.4 
3.JQuery 1.8.3 
4.RequireJS 2.1.5 

codice è molto semplice: (o vedi https://github.com/bighammer/test_relational_amd.git)

require.config({ 

paths : { 

    js     : 'js', 
    jquery    : 'js/jquery-1.8.3', 
    underscore   : 'js/underscore', 
    backbone    : 'js/backbone', 
    'backbone-relational' : 'js/backbone-relational' 
}, 

shim : { 
    underscore : { 
     exports : '_' 
    }, 
    backbone : { 
     deps : ['underscore', 'jquery'], 
     exports : 'Backbone' 
    }, 

    'backbone-relational' : { 
     deps: ['backbone'] 
    } 
} 

});

define(['backbone', 'backbone-relational'], function (Backbone) { 

var Child = Backbone.RelationalModel.extend(); 
var Parent = Backbone.RelationalModel.extend({ 
    relations : [ 
     { 
      key   : 'child', 
      type   : Backbone.HasOne, 
      relatedModel : 'Child' 
     } 
    ] 

}); 

var test = new Parent(); 

});

Salva sopra il codice a main.js e incluso nel index.html come segue:

Non funziona. C'è un messaggio di avvertimento:

Relation=child: missing model, key or relatedModel (function(){ return parent.apply(this, arguments); }, "child", undefined). 

ho letto il codice sorgente di backbone-relazionale e sapere che c'è qualcosa che non va con lo spazio dei nomi. Relational-Backbone non può trovare il relatedModel definito in "Parent" (cioè non può trovare releatedMode: "Child"). Non sono riuscito a trovare la soluzione per risolvere questo problema a causa della mia conoscenza limitata di javascript :-)

Qualcuno può aiutarmi con questo?

Prima ho chiesto alla mia domanda, ho studiato le seguenti soluzioni:

Backbone.RelationalModel using requireJs
Can't get Backbone-relational to work with AMD (RequireJS)
Loading Backbone.Relational using Use! plugin

Nessuno di loro ha lavorato in questo caso.

+1

Dopo un'altra lunga ricerca, sth viene fuori :-) Sembra che il problema riguardi la funzione "getObjectByName". Non può funzionare bene con requireJS (ADM). Attualmente, devo installare un globel var per risolvere il problema. Sono sicuro che ci deve essere una soluzione migliore. Qui è il mio soluton temp: (1) impostare un var globale e impostare l'ambito del modello di ricerca sull'app globale ("APP") var = {}; define (funzione [ 'spina dorsale-relazionale'],() { Backbone.Relational.store.addModelScope (APP); }) (2) – bighammer

risposta

15

Non è necessario fare riferimento a relatedModel per stringa, è possibile fare riferimento direttamente, quindi anziché relatedModel: 'Child', utilizzare: relatedModel: Child.

E dal momento che si utilizza requireJS, è possibile fare riferimento facilmente al modello da altri file.

define(['backbone', 'models/child', 'backbone-relational'], function (Backbone, Child) { 
    var Parent = Backbone.RelationalModel.extend({ 
    relations : [{ 
     key   : 'child', 
     type   : Backbone.HasOne, 
     relatedModel : Child 
    }] 
    }); 

    var test = new Parent(); 
}); 
+0

Grazie mille. Funziona. In realtà, ho provato a usare Reference una volta, ma non ho funzionato. Ora capisci perché non ha funzionato quella volta. È causato dal mio altro errore nel codice sorgente del progetto :( – bighammer

0

La soluzione di cui sopra non si applicava a me. Sto gradualmente spostando il codice da Rails Asset Pipeline (non RequireJS/AMD/CommonJS/qualsiasi cosa) in Webpack, iniziando dalle dipendenze.Quando mi sono trasferito richiede backbone-relational in Webpack preparazione fascio dai miei modelli e definizioni di relazione erano ancora in Rails Asset Pipeline, ho cominciato a farmi un sacco di inspiegabile Relation=child: missing model, key or relatedModel (function(){ return parent.apply(this, arguments); }, "child", undefined).

In mia caso, la soluzione ha finito per essere abbastanza semplice, nonostante le molto tempo per scoprire da parte mia:

// In a Webpack module, later included into Rails Asset Pipeline 
// temporarily to facilitate migration 

require('expose?Backbone!backbone') // Exposing just for migration 
require('backbone-relational') 
Backbone.Relational.store.addModelScope(window) 

backbone-relational di default usa la sua portata globale per risolvere basati su stringhe relatedModel s, ma da quando è stato necessario, senza un vero e proprio portata globale , la soluzione è semplicemente quello di passare chenell'uso di addModelScope in modo che possa cercare quell'ambito per i modelli specificati.