【问题标题】:Trigger same location route触发同位置路由
【发布时间】:2012-01-22 23:08:17
【问题描述】:

有没有办法在backbone.js 中触发相同的位置路由,例如当位置为/My/App/#/About 并且用户再次单击具有相同路由的锚点以刷新页面内容时。

【问题讨论】:

    标签: javascript routes backbone.js


    【解决方案1】:
    Backbone.history.loadUrl(Backbone.history.fragment);
    

    您的具体问题的解决方案并没有真正记录下来,似乎建议的最佳做法是只调用在您要触发的路由中声明的函数:/

    参考:https://github.com/documentcloud/backbone/issues/1214

    到目前为止,其他答案都是正确的,但他们忘记提及如果导航到的哈希与当前哈希相同,则不会触发任何内容。

    【讨论】:

    • 似乎这是唯一真正允许刷新同一页面的答案,谢谢!
    • 我们不应该使用 Backbone.history.getFragment() 这样我们就不会访问历史的属性吗?在我看来似乎更干净。
    • getFragment() 对于更现代的 Backbone 来说肯定是更合适的方法。但是,我会 +1 关于运行声明函数的评论,而不是试图欺骗路由器更新。
    • 另外,较新的 Backbone.Router 类可以接受一个对象,而不是 true/false,Router.navigate(Backbone.history.getFragment(), {trigger:true,replace:true}); 这将取代现有的导航(它在技术上已经这样做了,因为目标哈希是与当前哈希相同)
    【解决方案2】:
    Router.navigate('about', true);
    

    这样你就可以手动触发路由了。

    【讨论】:

      【解决方案3】:

      假设您想要执行此操作的不仅仅是关于页面,请使用:

      route = Backbone.history.fragment;
      yourRouter.navigate(route, true);
      

      【讨论】:

        【解决方案4】:

        由于 Backbone 路由器会在您要加载的 URL 片段中查找更改,因此对我有用的是首先导航到“/”而不触发,然后导航到您想要使用触发器触发的 URL(片段) .如果您愿意,您可以很容易地将其构建到默认路由器行为中。

        例如

        App.Routers.appRouter.navigate '/', {trigger: false}
        App.Routers.appRouter.navigate myPath, {trigger: true}
        

        【讨论】:

          【解决方案5】:

          使用 Backbone 0.9.2,您传入一个选项对象并将 'trigger' 设置为 'true'。

          router.navigate('some/route', { trigger : true });
          

          参考:http://documentcloud.github.com/backbone/#Router-navigate

          【讨论】:

          • 这不适用于重新加载当前路线。如果目标片段与当前片段匹配,则导航返回。
          【解决方案6】:

          另一个选项:你可以添加一个带有随机值的参数,这样每次调用的哈希值都会不同,即使你调用的是同一个页面。

          【讨论】:

            【解决方案7】:

            感谢@eddywashere 的建议,真的很棒。我添加了一个小编辑来检查您是否在最后一个(最新的)网址上,如果是,则加载该历史记录。很简单,认为它可能会对遇到相同问题的人有所帮助。

            $("[data-href]").on("click", function(e) {
              var href;
              e.preventDefault();
              href = $(e.currentTarget).data("href");
              if ((_.last(this.history)) === href) {
                return Backbone.history.loadUrl(_.last(this.history));
              } else {
                return this.router.navigate(href, true);
              }
            });
            

            【讨论】:

            • 愿意用普通的javascript而不是coffeescript分享这个吗?
            【解决方案8】:
            router.navigate(route, {trigger: false}); // Changes URL but it will not trigger...Ex: In place of route -- 'about/1' or 'about' etc
            
            Backbone.history.loadUrl(Backbone.history.fragment); // Changed route will be triggered here.
            

            【讨论】:

              猜你喜欢
              • 2013-12-17
              • 1970-01-01
              • 1970-01-01
              • 2019-08-11
              • 1970-01-01
              • 1970-01-01
              • 2018-11-06
              • 1970-01-01
              • 2017-03-15
              相关资源
              最近更新 更多