問題は次のとおりです。ステップ2に進むとき。step2はよく燃え、その後何らかの理由でルートがアクティブになります。この問題を解決する方法は?
シナリオは次のとおりです。ステップ1から開始->ステップ2に進みます->step2viewをレンダリングし、すぐにルートを再開します。そのような行動の理由は何ですか?
以下のショートコード。
マークアップが最小限のシンプルなページがあります
<div id="contentHolder">
</div>
そしてまたいくつかのバックボーンのもの
var StateModel = Backbone.Model.extend({
defaults: { state: "start" }
});
var StepModel = Backbone.Model.extend({
defaults: { selected: [], location: null }
});
var WizardView = Backbone.View.extend({
router: null,
nestedViewModels: [],
initialize: function () {
this.model.bind("change", this.render, this);
this.render();
},
render: function () {
switch (this.model.get("state")) {
case "start":
case "step1":
var step1 = new Step1View({el: $("#contentHolder")});
break;
case "step2":
var step2 = new Step2View({el: $("#contentHolder")});
break;
case "step3":
var step3 = new UploadView({el: $("#contentHolder")});
break;
}
}
});
var Step1View = Backbone.View.extend({
goToStep2: function(){
router.navigate("!/step2", true);
}
});
var Step2View = Backbone.View.extend({
});
//wizard - is a global variable
var Router = Backbone.Router.extend({
routes: {
"": "start",
"!/step1": "step1",
"!/step2": "step2"
},
start: function () {
wizard.model.set("state", "start");
},
step1: function () {
wizard.model.set("state", "step1");
}
step2: function () {
wizard.model.set("state", "step2");
}
});
リストされているのはメインコードのみで、多くの補助コードはスキップされています。必ず-すべてのオブジェクトが割り当てられています。何度もチェックしています。
UPD:次のすべてのビューは前のビューと同じ場所にレンダリングされます。そして、Step2がレンダリングした後、何らかの理由でURLがデフォルトに変更されます。したがって、url ...#!/step2の代わりにurl...#に変更されます。これが、ルーターが「開始」する理由だと思います。しかし、私にはわかりません-何がURLを変更するのか。
UPDは、次の順序で機能するようになりました。
- Step1View.gotoStep2
- Router.step2
- WizardView.render
- Step2View.initialize
- Step2View.render
- router.start
router.startは明らかに呼び出されるべきではありません