Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/385.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

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 主干js在返回/转发时防止url哈希更改_Javascript_Backbone.js_Url Routing - Fatal编程技术网

Javascript 主干js在返回/转发时防止url哈希更改

Javascript 主干js在返回/转发时防止url哈希更改,javascript,backbone.js,url-routing,Javascript,Backbone.js,Url Routing,我正在使用Backbone.js开发一个非常基本的SPA。我的应用程序几乎没有路由。其中有两个问题:索引路径(“/#索引”)和菜单路径(“/#主菜单”) 我的应用程序中的一个简单工作流如下:用户填写表单->单击登录->触发ajax请求->如果登录成功,则转到“/#主菜单”路径。如果登录失败,请继续使用“/#索引”路径。 在“/#主菜单”上,如果用户单击注销->ajax请求->如果注销成功,则转到“/#索引”。如果注销失败,则保持在“/#主菜单”上 我正在努力解决的问题是: 成功登录后触发转换到“

我正在使用Backbone.js开发一个非常基本的SPA。我的应用程序几乎没有路由。其中有两个问题:索引路径(“/#索引”)和菜单路径(“/#主菜单”)

我的应用程序中的一个简单工作流如下:用户填写表单->单击登录->触发ajax请求->如果登录成功,则转到“/#主菜单”路径。如果登录失败,请继续使用“/#索引”路径。 在“/#主菜单”上,如果用户单击注销->ajax请求->如果注销成功,则转到“/#索引”。如果注销失败,则保持在“/#主菜单”上

我正在努力解决的问题是:

  • 成功登录后触发转换到“/#mainmenu”的干净方法(我目前使用router.navigate(“mainmenu”,{trigger:true});但在derrick bailey的文章中,应该避免使用这种方法)
  • 当从“/#主菜单”路径按浏览器中的“后退”按钮时,一种防止用户返回“/#索引”的干净方法。我还想保留url哈希以反映当前视图
  • 阻止用户在成功注销后转到“/#主菜单”
  • 当点击浏览器的后退/前进按钮时,这甚至可以防止url散列更改吗
  • 当我说“干净”时,我指的是“什么是最佳实践?”。我通过保存url哈希并恢复适当的哈希(通过router.navigate(currentRoute,{replace:true});)部分解决了一些问题,但我觉得这是一种黑客方法


    欢迎您提供任何反馈,我们对此深表感谢。

    解决此问题的一种方法是,在执行实际回调路由之前,对需要进行身份验证状态检查的路由应用异步
    before
    过滤器

    例如:

    避免{trigger:true}的原理基于这样一个事实:当路由器被这个标志触发时,该路由的整个初始化过程都会被触发。您将失去以前定义AppState的好处,因为应用程序必须重新初始化所有内容,而这项工作以前已经完成过

    实际上,我认为评估web应用程序的实际功能是很有用的。如果丢失appstate不是一个问题,因为您要呈现的视图是全新的,那么我认为创建客户端重定向以重新初始化您的应用不会有问题。

    另一方面,如果您的应用程序已经渲染了许多视图,并且您希望这些视图保持与以前相同的状态,那么您可以在每个需要验证状态的组件上侦听验证状态事件,并在需要时仅对这些视图进行相应的重新渲染

    解决此问题的一种方法是,在执行实际回调路由之前,对需要验证状态检查的路由应用异步
    before
    过滤器

    例如:

    避免{trigger:true}的原理基于这样一个事实:当路由器被这个标志触发时,该路由的整个初始化过程都会被触发。您将失去以前定义AppState的好处,因为应用程序必须重新初始化所有内容,而这项工作以前已经完成过

    实际上,我认为评估web应用程序的实际功能是很有用的。如果丢失appstate不是一个问题,因为您要呈现的视图是全新的,那么我认为创建客户端重定向以重新初始化您的应用不会有问题。
    另一方面,如果您的应用程序已经渲染了许多视图,并且您希望这些视图保持与以前相同的状态,那么您可以在每个需要验证状态的组件上侦听验证状态事件,并在需要时仅对这些视图进行相应的重新渲染

  • 我不认为触发路由有任何问题,已经做了2年多没有任何问题。这一切归结为您的要求,阅读这篇文章对我来说似乎有很多工作要做

  • 有多种方法可以做到这一点。首先,可以使用
    window.history.forward()
    禁用。第二,我最喜欢的,是在计算机中进行处理。A可能看起来像:

  • execute:function(回调、参数、名称){
    如果(!loggedIn){
    goToLogin();
    return false;//特权路由不会触发
    }
    if(callback)callback.apply(this,args);
    }

  • 我不认为触发路由有任何问题,已经做了2年多没有任何问题。这一切归结为您的要求,阅读这篇文章对我来说似乎有很多工作要做

  • 有多种方法可以做到这一点。首先,可以使用
    window.history.forward()
    禁用。第二,我最喜欢的,是在计算机中进行处理。A可能看起来像:

  • execute:function(回调、参数、名称){
    如果(!loggedIn){
    goToLogin();
    return false;//特权路由不会触发
    }
    if(callback)callback.apply(this,args);
    
    }

    谢谢您的回答。我没有想过直接使用历史api。这似乎是一个可靠的好主意。我将尝试这种方法。我使用的“hacky”解决方案看起来与上面的示例代码非常相似。但根据我的经验,按后退/前进将更改url哈希,并且必须手动调整它。我希望有更好的解决办法。谢谢你的反馈。谢谢你的回答。我没有想过直接使用历史api。这似乎是一个可靠的好主意。我将尝试这种方法。我使用的“hacky”解决方案看起来与上面的示例代码非常相似。但根据我的经验,按后退/前进将更改url哈希,并且必须手动调整它。我希望有更好的解决办法。感谢您的反馈。感谢您对避免
    {trigger:true}
    的解释以及您的反馈。感谢您对避免
    {trigger:tr>的解释