Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript “一个人是怎么做的?”;听听路由器的声音;(在视图/模型中响应路由器事件)在Backbone.js中?_Javascript_Backbone.js - Fatal编程技术网

Javascript “一个人是怎么做的?”;听听路由器的声音;(在视图/模型中响应路由器事件)在Backbone.js中?

Javascript “一个人是怎么做的?”;听听路由器的声音;(在视图/模型中响应路由器事件)在Backbone.js中?,javascript,backbone.js,Javascript,Backbone.js,在Backbone.js文档中,如中所述 当访问者按下后退按钮,或输入URL,并匹配特定路线时, 操作的名称将作为事件激发,以便其他对象可以侦听路由器, 并得到通知 我试图在这个相对简单的示例中实现这一点: 相关JS: $(document).ready(function(){ // Thing model window.Thing = Backbone.Model.extend({ defaults: { text: 'THIS IS A

在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>

但是,视图的initialize函数中引用的router事件似乎没有被拾取(其他一切都可以工作——我正在成功地调用路由器中定义的“showThing”方法)

我相信我一定对本声明的文档意图有一些误解。因此,我希望得到的回应是:我希望有人修改我的代码,使其通过视图拾取的路由器事件工作,或者,清楚地解释我上面列出的路由器文档打算我们做什么,理想情况下使用替代代码示例(或者使用我的,修改过的)


非常感谢您提供的任何帮助

这是因为您将侦听器绑定到了错误的对象。在您的视图中尝试以下操作:

window.ThingView = Backbone.View.extend({

    initialize: function() {
            myRouter.on('route:showThing', this.anything);
    },

...

好的,明白了。我想我误解了这一部分:“…以便其他对象可以侦听路由器”,以某种方式将其解读为“…其他对象可以侦听路由器事件”。我想这意味着,从架构上讲,最好实例化一个全局路由器,该路由器视图可以根据需要引用。谢谢,德林切夫!你不应该使用
router.on('route:thing',this.anything')在您的初始化方法中?