gpt4 book ai didi

javascript - backbone.js 阻止路由执行

转载 作者:行者123 更新时间:2023-12-02 19:06:55 25 4
gpt4 key购买 nike

是否可以仅使用路由器来阻止 backbone.js 中的路由执行?

我知道每个路由都有一个回调方法,我可以在其中检查是否允许路由,我只是不知道如何根据 View 模型上的属性(canNavigate)来阻止执行。

我还希望它能够在未指定为路由的 url 上工作(sammy.js 不能执行此操作,backbone 可以执行此操作吗?)。例如:

当路由#/contact打开时, View 模型“contact”上的事件方法被调用。从 #/contact 导航到任何其他网址(例如 #/page1/page2google.com 时)我希望调用联系人 View 模型上的 canNavigate 方法。如果返回 false,则应该阻止到 url 的路由,并且应该出现一条消息(我不需要显示消息等的代码,如果可能的话,只需要backbone.js 代码)。

这可以通过 backbone.js 实现吗?如果没有,哪个其他框架(除了 sammy.js 因为我们已经尝试过了)可以解决这个问题?

最佳答案

如果您编写路由器扩展,则每个框架都可以实现。比问这个问题花费的时间可能更少。不知道backbone是否支持,我去看看代码。

这是您正在寻找的方法:

route: function(route, name, callback) {
if (!_.isRegExp(route)) route = this._routeToRegExp(route);
if (!callback) callback = this[name];
Backbone.history.route(route, _.bind(function(fragment) {
var args = this._extractParameters(route, fragment);
callback && callback.apply(this, args);
this.trigger.apply(this, ['route:' + name].concat(args));
Backbone.history.trigger('route', this, name, args);
}, this));
return this;
},

如您所见,它只是运行回调,并且不会阻止任何内容。

您可以这样扩展它:

var RouteError(message) {
this.name = "RouteError";
this.message = (message || "");
}
RouteError.prototype = Error.prototype;


var MyRouter = function (){
Backbone.Router.apply(this, arguments);
};
MyRouter.prototype = Object.create(Backbone.Router.prototype);
MyRouter.prototype.constructor = MyRouter;
_.extend(MyRouter.prototype, {
route: function(route, name, callback) {
if (!_.isRegExp(route)) route = this._routeToRegExp(route);
if (!callback) callback = this[name];
Backbone.history.route(route, _.bind(function(fragment) {
var args = this._extractParameters(route, fragment);
try {
callback && callback.apply(this, args);
}
catch(e)
{
if (e instanceof RouteError)
return this;
else
throw e;
}
this.trigger.apply(this, ['route:' + name].concat(args));
Backbone.history.trigger('route', this, name, args);
}, this));
return this;
},
});

或者这样:

var loadUrl = Backbone.History.prototype.loadUrl;
Backbone.History.prototype.loadUrl = function (fragmentOverride){
try {
loadUrl.apply(this, arguments);
}
catch (e){
if (e instanceof RouteError)
return ;
else
throw e;
}

};

(我没有检查这些...)

所以我认为 Backbone 本身不支持这一点...

关于javascript - backbone.js 阻止路由执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14232794/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com