在Backbone.js的文檔,在the entry for the Router.routes method,據稱在Backbone.js中,如何「聽路由器」(響應視圖/模型中的路由器事件)?
當訪問者按下後退按鈕,或者輸入一個URL,和特定的路線一致, 動作的名稱將被解僱作爲事件,以便其他對象可以收聽路由器 並得到通知。
我試圖在這個相對簡單的例子來實現這一點:
相關JS:
$(document).ready(function(){
// Thing model
window.Thing = Backbone.Model.extend({
defaults: {
text: 'THIS IS A THING'
}
});
// An individual Thing's View
window.ThingView = Backbone.View.extend({
el: '#thing',
initialize: function() {
this.on('route:showThing', this.anything);
},
anything: function() {
console.log("THIS DOESN'T WORK! WHY?");
},
render: function() {
$(this.el).html(_.template($('#thing-template').html(), {
text: this.model.get('text')
}));
return this;
}
});
// The Router for our App
window.ThingRouter = Backbone.Router.extend({
routes: {
"thing": "showThing"
},
showThing: function() {
console.log('THIS WORKS!');
}
});
// Modified from the code here (from Tim Branyen's boilerplate)
// http://stackoverflow.com/questions/9328513/backbone-js-and-pushstate
window.initializeRouter = function (router, root) {
Backbone.history.start({ pushState: true, root: root });
$(document).on('click', 'a:not([data-bypass])', function (evt) {
var href = $(this).attr('href');
var protocol = this.protocol + '//';
if (href.slice(protocol.length) !== protocol) {
evt.preventDefault();
router.navigate(href, true);
}
});
return router;
}
var myThingView = new ThingView({ model: new Thing() });
myThingView.render();
var myRouter = window.initializeRouter(new ThingRouter(), '/my/path/');
});
相關的HTML:
<div id="thing"></div>
<!-- Thing Template -->
<script type="text/template" id="thing-template">
<a class='task' href="thing"><%= text %></a>
</script>
然而,路由器事件中引用在視圖的初始化函數中似乎沒有被拾取(其他一切正常 - 我正在成功調用「showThi」 ng「方法在路由器中定義)。
我相信我必須對本聲明所指的文檔有一些誤解。因此,我在尋找的答案是:我希望有人修改我的代碼,以便它可以通過路由器事件獲得視圖,或者清楚地解釋我列出的路由器文檔上面打算我們做,理想情況下與替代代碼示例(或使用我的,修改)。
非常感謝您提供的任何幫助!
你不應該在initialize方法中使用'router.on('route:thing',this.anything)'' – WarFox 2014-03-03 07:27:34