2015-05-05 17 views
9

Ich versuche MVC mit AMD in Canjs zu implementieren. Dafür benutze ich requirejs. Das ist mein domains.json Datei:can-model kann keine Daten von .json-Datei bekommen

[    
"1":{"uid":  "1","urls": "domain1.abc.com"}, 
"2":{"uid": "2","urls": "domain2.abc.com"}, 
"3":{"uid": "3","urls": "domain3.abc.com"} 
] 

Das ist mein domainModel ist:

define(['can'], function(can){ 
    SearchModel= can.Model({ 
    id: 'uid', 
    findAll: 'GET /domains.json' 
    },{}) 
    return SearchModel; 
}) 

Dies ist mein Controller:

define(['can','jquery'],function(can,$){ 
domainController=can.Control({defaults:{view:"../view/search.hbs" }},   
    { 
    init : function(element,options){ 
     this.element.html(can.view(this.options.view,{ 
      searchlist : this.options.search 
     })) 
    } 
}); 
return domainController; 
} 

Das ist mein Haupt js ist:

equirejs(['can','controller/domainController','model/domainModel'], 
function(can, domainController,domainModel) { 
    var Application = can.Control.extend({ 
    defaults :{ } 
    },{ 
     init: function(element,options){ 
     console.log('loaded'); 
     domainModel.findAll({}, function(domains){ 
      domainObject:{searchdomains : domains} 
       new domainController('#search',domainObject) 
      }); 
     } 
    }) 
return Application; 
}); 

Ich bin Trac Ich setze Breakpoints.Auf Model Breakpoints bekomme ich keine Werte in lokalen Variablen in Chrome Devtools.

Die Eigenschaft url hat ‚undefined/{id}‘ Wert und findAll Verfahren mit vier Eigenschaften Argumente dh Anrufer, Länge und Name Wert null aufweist, null, 0 und „“ jeweils

Ich habe überprüft meine URL des Modells durch Navigieren durch localhost im Browser und es ist korrekt. Warum kann dann das Modell die Werte der JSON-Datei nicht bekommen?

+1

Objektnamen erinnern kann nicht mit starten eine Zahl, also in der Datei domains.json, ändern Sie die Namen von 1, 2, 3 in etwas wie "eins", "zwei", "drei". Es ist in Ordnung, einen json mit Objektnamen zu erstellen, die mit Ganzzahlen beginnen, aber wenn Sie versuchen, auf diese Objekte in js zuzugreifen, wird es nicht richtig funktionieren. [gültige JS-Variablennamen] (https://mathiasbynens.be/notes/javascript-identifiers) –

Antwort

5

Sie sollten eine Fehlermeldung erhalten, da Ihre Daten nicht das sind, was Model für findAll erwartet. Ihre JSON sollte ein Array (oder zumindest eine Länge Eigenschaft haben) sein:

[ 
    {"uid":  "1","urls": "domain1.abc.com"}, 
    {"uid": "2","urls": "domain2.abc.com"}, 
    {"uid": "3","urls": "domain3.abc.com"} 
] 

Sie wahrscheinlich auch die id Eigenschaft festlegen möchten in Sie SearchModel zu uid:

define(['can'], function(can){ 
    SearchModel= can.Model({ 
    id: 'uid', 
    findAll: 'GET /domains.json' 
    },{}) 
    return SearchModel; 
}) 
+0

Ich habe es bereits mit Array versucht. Es funktioniert nicht. Ist es wichtig, ID-Eigenschaften im Modell zu definieren? Wenn ja, kannst du mir bitte den Grund nennen. –

+0

Nun, es muss wissen, was die ID-Eigenschaft der Modelle ist. Das sollte jedoch nicht das Problem sein. Hast du '{" data ": []}' in deiner JSON-Datei ausprobiert? Können Sie sehen, dass die richtige Datei auf der Registerkarte "Netzwerk" angefordert wird? – Daff

+0

vielen Dank. Ich wusste nicht, dass "Daten" ein Schlüsselwort ist, das im JSON verwendet werden muss. Ich habe ein anderes Wort benutzt. Ihr macht gute Arbeit. Bitte mach weiter so !! –