Frage

Ich habe eine JSON -Datei, die so aussieht:

JSON:

{
 "clefs": [ 
           {"title": "..", "path": ".."},
           ... , 
           {"title": "..", "path": ".."}
          ],

  ....

 "rests": [ 
           {"title": "..", "path": ".."}, 
           ... , 
           {"title": "..", "path": ".."}
          ]

} 

Dies ist ein verschachtelter JSON, oder? Also versuche ich, das in Modell/Sammlungen zu konvertieren, in die verschachtelt ist Backbone.js so was:

Backbone.js:

window.initModel = Backbone.Model.extend({
  defaults: {
    "title": "",
    "path": ""
  }
});

window.CustomCollection = Backbone.Collection.extend({
  model: initModel
});

window.Init = Backbone.Model.extend({
  url : function(){
  return  "/api/data.json"      
},

parse: function(response) {

  clefs = new CustomCollection();
  clefs.add(response.clefs);        
  this.set({clefs: clefs});

  .....

  rests = new CustomCollection();
  rests.add(response.rests);        
  this.set({rests: rests});
} 
});

Jetzt habe ich ein Modell herausgekommen und in seine Attribute meine Sammlung: Clefs, ..., ruhen.

Wenn es gekommen ist, meine Sammlung auf eine Aussicht zu geben, kann ich nicht!

ich habe das gemacht

Router:

$(document).ready(function() {
  var AppRouter = Backbone.Router.extend({
  routes: {
    ""  : "init"
  },

  init: function(){
    this.initial = new Init();      
    this.initialView = new InitView({model: this.initial});
    this.initial.fetch();

 }
});

var app = new AppRouter();
Backbone.history.start();
});

Aussicht :

window.InitView = Backbone.View.extend({
  initialize : function() {
    this.model.bind("reset", this.render, this);//this.model.attributes send my 4 Collections Models back! But impossible to extract with "get" these Attributes

},

  render : function() {
    console.log("render");
  }
});

Es ist momentan eine hässliche Situation !! Ich habe ein Backbone -Modell mit Attributen (Sammlungen), aber ich kann diese Attribute nicht extrahieren. Kein Erfolg!

Was ich möchte ist, meine Sammlungen aus dem Modellnamen "initial" zu extrahieren !! this.initial.attributes Geben Sie ein Objekt mit meinen Sammlungen zurück! Aber ich kann diese nicht an die Aussicht übergeben!

Update 1:

Jetzt die Modell wird an die Ansicht übergeben, aber ich kann immer nicht auf seine Attribute zugreifen erhalten Oder senden Sie seine Attribute an andere Ansichten! Das Render kann auch nicht abgefeuert werden !!!

Update 2:Nach mehreren Tagen Kopfschmerzen nehme ich die Auflösung, um es einfach zu machen!

Wieso den? Weil ich gerade 4 Sammlungen habe: Clefs, Unfall, Notizen und Ruhe

MODELL :

window.initModel = Backbone.Model.extend({
  defaults: {
   "title": "",
   "path": ""
  }
});

window.ClefsCollection = Backbone.Collection.extend({
  model: initModel,
  url: "/api/data.json",
  parse: function(response){
    return response.clefs;
  }
});
...
and so on

Router:

....

this.clefsColl = new ClefsCollection();
this.clefsColl.fetch();
this.clefsCollView = new ClefsView({collection: this.clefsColl});

....
War es hilfreich?

Lösung

init: function(){
  this.initial = new Init();      
  this.initialView = new InitView({model: this.initial});
  this.initial.fetch();
}

Sieht wie erwartet aus, aber das:

clefs = new CustomCollection();
clefs.add(response.clefs);        
this.set({clefs: clefs});

Nicht so viel. Ich bin selbst ein bisschen wie ein Rückgrat. Was ich zuvor getan habe, ist eine Ansicht, zwei Modelle zu verfolgen (wie es eine Liste von Listen zeigte, aber mit nur einem der zu einem bestimmten Zeitpunkt zutreffenden Untervermieter). Wann immer ein Element der ersten Liste geklickt wurde, wurde das Modell, das den Sublisten enthielt ), und setzen Sie dann ein Modell zurück, das an eine Ansicht gebunden ist, damit der aktuelle Sublist angezeigt wird. Das ist ein bisschen schwer ohne Code zu erklären, aber ich bin momentan ein bisschen kurz. Später kann ich versuchen, es besser zu erklären (vielleicht mit einer anderen Antwort).

Bearbeiten 1

Nur um zu verdeutlichen, war mein Einspruch, die Zuordnung durchzusetzen set und später durchdrehen get. Ich bin mir einfach nicht sicher, wie Backbone.js damit umgehen würde. Ich würde es aber gerne wissen.

Bearbeiten 2

Vielleicht möchten Sie sich ansehen:Backbone.js strukturieren verschachtelte Ansichten und Modelle

Grundsätzlich schlägt er vor, anstatt durch SET zuzuweisen, dass Sie nur die Sub -Models -Eigenschaften des Verbundmodells machen

Also statt

parse: function(response) {

  clefs = new CustomCollection();
  clefs.add(response.clefs);        
  this.set({clefs: clefs});

  .....

Du hättest

parse: function(response) {

  this.clefs = new CustomCollection();
  this.clefs.add(response.clefs);
     /*Or maybe you really mean this.clefs.reset(response.clefs)*/

  .....  /* something similar for rests, etc */

}

Und wenn Sie dann eine bestimmte Ansicht in Ihrem Router binden möchten, unter der Annahme, dass Sie CleftsView, RESTSVIEW usw. definiert haben, usw.

  init: function(){
    this.initial = new Init();      
    this.initialView = new InitView({model: this.initial});
    this.clefsView = new ClefsView({model: this.initial.clefs});
    this.restsView = new RestsView({model: this.initial.rests});

    .....

    this.initial.fetch();
    .....

  }

Ich hätte das vielleicht früher vorgeschlagen, aber ich war mir nicht sicher, ob dies eine gängige Praxis war oder nicht. Ich bin mir immer noch nicht sicher, ob ich den Vorschlag mag, da ich versucht wäre, die Pauses und Spaltenmodelle unter eine "Models" -Sache von zu setzen Init statt direkt unter Init.

Andere Tipps

Diese beiden Zeilen machen überhaupt keinen Sinn:

init: function(){
  this.init = new Init();
  this.initView = new InitView({collection: this.init.get("rests") });
  this.init.fetch();

Zuerst haben Sie eine Init -Funktion in Ihrem Router beim Aufrufen this.init = new Init(); Wird diese Funktion überschreiben. Wenn die Route also noch einmal aufgerufen wird, ist Ihre Funktion mehr, aber Ihr Modell. Als nächstes erstellen Sie ein neues Modell ohne Daten, so dass es leer ist. Als Sie versuchen, "Ruhe" aus dem leeren Modell herauszuholen. Danach füllen Sie das Modell. Vielleicht willst du so etwas:

init: function(){
  //create a new model, fetch the data from the server. On success create a new view passing data from the model.
  var init = new Init().fetch({
      success: function(){new InitView({collection: init.get("rests") });}
  });
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top