1

当我点击一个按钮时,我会在 View 中捕捉到点击:

events:{
   'click .parameter-input a': 'saveParameter'
},

在 saveParameter 函数中,我这样做:

saveParameter: function(ev) {
        parameter.value = $('.parameter-input .param').val();
        console.log(parameter.value);
        router.navigate("#/page2/" + parameter.value, {trigger:true});
        return false;           
    }

我的路线是这样定义的:

var Router = Backbone.Router.extend({
    routes: {
      "": "home",
      "page2/*parameter": "UIpage2",
    }
});

var page1 = new Page1();
var page2 = new Page2();

var router = new Router;
router.on('route:home', function() {
    page1.render();
    console.log("page1 render");
})
router.on('route:UIpage2', function(parameter){
    page2.render();
    console.log("page2 render " + parameter.value);
})

Page2 定义如下:

    var Page2 = Backbone.View.extend({
    el:'.page',
    render: function() {
        var template = _.template($('#page2').html(), {parameter: parameter});
        this.$el.html(template);
    }
});

当我导航到它时,如何强制使用 page2 渲染再次刷新 .page?在 page2 上渲染永远不会被调用..

编辑:参数是从某个输入框中取出的字符串值,需要在诸如 mydomain.com/#/page2/parameter 之类的 URL 和 page2 上的某个 div 中显示。

4

2 回答 2

1

哈希不应该在路由中,所以替换

router.navigate("#/page2/" + parameter.value, {trigger:true});

经过

router.navigate("page2/" + parameter.value, {trigger:true});

还要确保您已使用Backbone.history.start().

这是一个最小的工作示例。

var Router = Backbone.Router.extend({
  routes: {
    "": "index",
    "bar": "bar",
    "page2/*parameter": "foo"
  },

  index: function() {
    console.log("on page index");
  },

  bar: function() {
    console.log("on page bar");
  },

  foo: function(data) {
    console.log("on page foo with data: " + data);
  }
});


var router = new Router();
console.log("router created");
Backbone.history.start();
console.log("initializing backbone history");
router.navigate("bar", {trigger: true});
router.navigate("page2/foobar", {trigger: true});
于 2013-09-14T14:09:25.073 回答
0

如果您www.xyz.com/#route1的 URL 中有并且您再次尝试执行router.navigate('route1', {trigger: true});,则不会触发路由处理程序,route1因为您已经在route1

如果您需要刷新页面,即重新渲染 page2,只需调用page2.render();.

如果您想使用路由器进行此操作,则必须暂时更改路由,然后路由到您所需的页面。(注意:这将在您的路由历史记录中添加不必要的条目。)例如:如果您已经在route1iewww.xyz.com/#route1并且您想重新渲染视图,请执行以下操作 -

router.navigate('temp', {trigger : false});

以上行将更改地址栏中的 URL,但不会调用任何路由处理程序。在那次通话之后

router.navigate('route1', {trigger : true}); // this will now re-render view

于 2013-09-14T19:10:53.607 回答