在 div 上关注 backbone.js 中的网址点击
Following URLS in backbone.js on div click
我已经开始熟悉 backbone.js 并且需要一些时间来了解路由器、模型和视图。
通过路由器处理路由并定义它们是小菜一碟,直到该特定路由被定义为 <a href="#some-url">
(我不确定 100%,但我认为 backbone 覆盖默认值 link 行为,而不是重定向它动态加载保留在当前页面上的模板)。
我需要的是在用户点击 div 元素时执行的动作。在视图下添加事件很容易,点击 div 正确调用该函数。
但从那时起我不确定该怎么做。我可以很容易地添加:window.location.href = "#some-url"
,浏览器会将页面重定向到请求的 href,但这似乎违反了单页规则 backbone 正在尝试创建。
有没有比通过 window.location 强制浏览器更改 href 更合适的方法来处理视图更改?
编辑:添加了代码。
app.js
require(['jquery', 'backbone', 'app/router'], function ($, Backbone, Router) {
window.router = new Router();
Backbone.history.start();
});
app/router.js
var $ = require('jquery'),
Backbone = require('backbone'),
HomeView = require('app/views/Home'),
$body = $('body'),
homeView = new HomeView({el: $body});
...
return Backbone.Router.extend({
routes: {
"": "home",
"about": "about"
},
home: function () {
homeView.delegateEvents();
homeView.render();
},
about: function () {
require(["app/views/About"], function (AboutView) {
var view = new AboutView({el: $body});
view.render();
});
},
...
app/router/浏览次数/home.js
return Backbone.View.extend({
events: {
"click #about": "followAbout"
},
render: function () {
this.$el.html(template());
return this;
},
followAbout: function () {
console.log('about');
window.router.navigate( "about", { trigger: true } )
}
});
假设您已经像这样定义了您的路由器
var Workspace = Backbone.Router.extend({
routes: {
"help": "help", // #help
"search/:query": "search", // #search/kiwis
"search/:query/p:page": "search" // #search/kiwis/p7
},
help: function() {
...
},
search: function(query, page) {
...
}
});
然后创建一个新的路由器实例
router = new Workspace();
Backbone.history.start();
在您的div中,您可以选择在数据属性中定义您的路线,这对您来说很方便
<div id="my_div" data-path="some-url">
...
</div>
当用户单击 div 时,您从其数据中获取路线并使用 navigate
函数像这样转到该路线。
$("#my_div").on('click', function(e){
var path = $(this).attr("data-path");
router.navigate(path, { trigger: true});
//this will navigate to the path like a single page app without reloading the page
});
查看 backbone docs 了解更多。
Edit
...
//events inside first view
'click #div-1': 'myFunction'
//myfunction code
myFunction: function(e){
clicked_div = e.currentTarget;
path = $(clicked_div).attr('data-path'); //I'm assuming you've stroed the path in your div, or you can get it how ever you like
window.router.navigate(path, {trigger: true});
//Also I am assuming you've defined your router under the window object directly, so it can be accessed directly. Or you can always namespace it in an object
//, to avoid collision
}
我已经开始熟悉 backbone.js 并且需要一些时间来了解路由器、模型和视图。
通过路由器处理路由并定义它们是小菜一碟,直到该特定路由被定义为 <a href="#some-url">
(我不确定 100%,但我认为 backbone 覆盖默认值 link 行为,而不是重定向它动态加载保留在当前页面上的模板)。
我需要的是在用户点击 div 元素时执行的动作。在视图下添加事件很容易,点击 div 正确调用该函数。
但从那时起我不确定该怎么做。我可以很容易地添加:window.location.href = "#some-url"
,浏览器会将页面重定向到请求的 href,但这似乎违反了单页规则 backbone 正在尝试创建。
有没有比通过 window.location 强制浏览器更改 href 更合适的方法来处理视图更改?
编辑:添加了代码。
app.js
require(['jquery', 'backbone', 'app/router'], function ($, Backbone, Router) {
window.router = new Router();
Backbone.history.start();
});
app/router.js
var $ = require('jquery'),
Backbone = require('backbone'),
HomeView = require('app/views/Home'),
$body = $('body'),
homeView = new HomeView({el: $body});
...
return Backbone.Router.extend({
routes: {
"": "home",
"about": "about"
},
home: function () {
homeView.delegateEvents();
homeView.render();
},
about: function () {
require(["app/views/About"], function (AboutView) {
var view = new AboutView({el: $body});
view.render();
});
},
...
app/router/浏览次数/home.js
return Backbone.View.extend({
events: {
"click #about": "followAbout"
},
render: function () {
this.$el.html(template());
return this;
},
followAbout: function () {
console.log('about');
window.router.navigate( "about", { trigger: true } )
}
});
假设您已经像这样定义了您的路由器
var Workspace = Backbone.Router.extend({
routes: {
"help": "help", // #help
"search/:query": "search", // #search/kiwis
"search/:query/p:page": "search" // #search/kiwis/p7
},
help: function() {
...
},
search: function(query, page) {
...
}
});
然后创建一个新的路由器实例
router = new Workspace();
Backbone.history.start();
在您的div中,您可以选择在数据属性中定义您的路线,这对您来说很方便
<div id="my_div" data-path="some-url">
...
</div>
当用户单击 div 时,您从其数据中获取路线并使用 navigate
函数像这样转到该路线。
$("#my_div").on('click', function(e){
var path = $(this).attr("data-path");
router.navigate(path, { trigger: true});
//this will navigate to the path like a single page app without reloading the page
});
查看 backbone docs 了解更多。
Edit
...
//events inside first view
'click #div-1': 'myFunction'
//myfunction code
myFunction: function(e){
clicked_div = e.currentTarget;
path = $(clicked_div).attr('data-path'); //I'm assuming you've stroed the path in your div, or you can get it how ever you like
window.router.navigate(path, {trigger: true});
//Also I am assuming you've defined your router under the window object directly, so it can be accessed directly. Or you can always namespace it in an object
//, to avoid collision
}