2013-01-26 11 views
13

In meiner Meteor App Backbone Router funktionieren nur wenn der Benutzer eingeloggt ist (über das accounts-base Paket). Es ist komisch. Dieser Router selbst funktioniert einwandfrei. Die showSaying() Funktion wird überhaupt nicht aufgerufen, wenn der Benutzer nicht angemeldet ist.Meteor App - Backbone Router wird nicht gerufen

Unten ist der Code in client.js im Client-Ordner. Muss ich etwas mit Sitzungen oder Auto-Publishing machen?

AphorismView = Backbone.View.extend({ 
el: "#aphorism-item", 
initialize: function(){ 
    _.bindAll(this, "render"); 
    this.render(); 
}, 
render: function() { 
    this.$el.append("<p style='height:600px; background-color:blue;'>hi</p>"); 
} 
}); 

// Creates a route to view the selected aphorism 
var Aphorism = Backbone.Router.extend({ 
    routes: {  
     "saying/:id": "showSaying" 
    }, 
    showSaying: function (id) { 
     var aphorism_view = new AphorismView(); 
     alert('Saying id ' + id + '.'); 
    } 
}); 

//establishes the router 
appRouter = new Aphorism; 

//Sets up backbone 
Meteor.startup(function() { 
    filepicker.setKey("AerIOvsmAQRGaNdEv0judz"); 
    filepicker.constructWidget(document.getElementById('attachment')); 
    Backbone.history.start({pushState: true}); 
}); 
+0

Ich vermute, dass dies mit der Ladegeschwindigkeit/-reihenfolge zu tun hat und dass das Laden länger dauert, was dazu führt, dass appRouter pünktlich ist. Versuchen Sie, die appRouter-Deklaration in Meteor.startup zu platzieren. – Rahul

+0

versuchte dieses Rahul - hat nicht funktioniert – squeezemylime

+0

Ich habe noch nicht an Win8 Metro Apps gearbeitet, also weiß ich nicht, ob es eine Entwicklungskonsole wie in Browsers gibt. Wenn ja, würde ich 'appRouter = new Aphorism;' kurz vor 'Backbone.history.start ({pushState: true});' aufrufen und das appRoute einer globalen Variablen zuweisen, um festzustellen, ob es überhaupt initialisiert ist. – wowpatrick

Antwort

1

Ihr Problem scheint nicht wie ein Backbone.js Problem überhaupt.

Haben Sie versucht, eine console.log-Anweisung in den startup() Callback zu setzen, um zu verifizieren, dass sie in allen Fällen aufgerufen wird? Wenn nicht, dann ist das zwischen dir und Meteor.

1

haben Sie versucht zu warten, dass das DOM bereit ist? zB: $(Backbone.history.start)

1

Versuchen Sie, die Backbone-History-Deklaration außerhalb von Meteor.start zu ziehen. Es gibt keinen Grund dafür, da zu sein. Ich glaube auch, dass showSaying nur aufgerufen wird, wenn Sie zu einer Route gehen, die den Parameter id hat (d. H. Sie können nicht einfach zu http://app/saying/ gehen).

Darüber hinaus müssen Sie möglicherweise approuter.navigate manuell aufrufen, damit der Router funktioniert, wenn Sie versuchen, programmgesteuert zu navigieren. (Ich weiß nicht, ob Sie es sind, aber es könnte das Problem sein).

Ansonsten kann ich keine Probleme mit diesem bestimmten Code finden. Das Problem könnte woanders liegen, wenn nichts, was ich vorgeschlagen habe, es löst.

Für ein Beispiel für eine funktionierende Router-Implementierung, könnten Sie sich https://github.com/Benaiah/Athenaeum/blob/master/client/router.coffee (Disclaimer: es ist von einer App, die ich schreibe) und versuchen, andere Unterschiede zu finden.

Hoffe, dass hilft.

+0

Ich werde diese Vorschläge überprüfen, danke – squeezemylime