启用 pushState 后导航不适用于空片段
navigate not working ONLY for empty fragment after enabling pushState
所以,我有一个完全使用哈希的 Backbone Marionette 应用程序。然后,我决定启用 pushState 以获得更好的用户体验 URLs.
我在以下位置访问应用程序:
http://localhost:8888/multikanban/app
我应用了以下更改:
启用推送状态
Backbone.history.start({pushState: true, root: "/multikanban/app/"});
定义以下.htaccess
<ifModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !index
RewriteRule (.*) app/index.html [L]
</ifModule>
此时,应用程序加载没有问题,我可以四处移动、登录等。但是,当 App.navigate("") 被调用时(当我需要进入初始应用程序状态时)我收到以下错误:
Uncaught SyntaxError: Unexpected token <
landing_app.js:15 Uncaught TypeError: Cannot read property 'showLanding' of undefinedlanding_app.js:15 (anonymous function)require.js:1658 context.execCbrequire.js:874 Module.checkrequire.js:1121 (anonymous function)require.js:132 (anonymous function)require.js:1164 (anonymous function)require.js:57 eachrequire.js:1163 Module.emitrequire.js:925 Module.checkrequire.js:1151 Module.enablerequire.js:782 Module.initrequire.js:1178 callGetModulerequire.js:1572 context.completeLoadrequire.js:1679 context.onScriptLoad
require.js:1903 Resource interpreted as Script but transferred with MIME type text/html: "http://localhost:8888/multikanban/scripts/apps/landing/show/show_controller.js".
使用 App.navigate("") 我只更新 URL,错误状态中不应该 "transferred"...
观察:
- App.navigate("") 在使用 pushState 之前有效。
- 将 App.navigate("") 更改为 App.navigate("a") 之类的内容可以使其正常工作,但当然 URL 是错误的..
- 评论 App.navigate("") 不会让应用程序崩溃,它根本不会更新 URL,所以是的,问题应该出在 App.navigate(" ")
如何让 App.navigate("") 工作?为什么该命令显然与服务器交互,它不应该只更新 URL 和历史记录吗?我可以在哪里询问这个问题?
您收到的错误似乎表明 requirejs 没有正确映射到您指定的路径。
好的,经过一番努力,我修复了它。显然,它与后面的更改无关,而是与上个月神秘工作的 requirejs 配置有关:D
我从
更改了 index.html 中的 data-main 和 src
<script data-main="scripts/main.js" src="scripts/vendor/requirejs/require.js"></script>
至
<script data-main="/multikanban/app/scripts/main.js" src="/multikanban/app/scripts/vendor/requirejs/require.js"></script>
此外,如果您有样式,请确保在 href 中定义绝对路径。
干杯!
感谢@jdaudier 的帮助
所以,我有一个完全使用哈希的 Backbone Marionette 应用程序。然后,我决定启用 pushState 以获得更好的用户体验 URLs.
我在以下位置访问应用程序:
http://localhost:8888/multikanban/app
我应用了以下更改:
启用推送状态
Backbone.history.start({pushState: true, root: "/multikanban/app/"});
定义以下.htaccess
<ifModule mod_rewrite.c> RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_URI} !index RewriteRule (.*) app/index.html [L] </ifModule>
此时,应用程序加载没有问题,我可以四处移动、登录等。但是,当 App.navigate("") 被调用时(当我需要进入初始应用程序状态时)我收到以下错误:
Uncaught SyntaxError: Unexpected token <
landing_app.js:15 Uncaught TypeError: Cannot read property 'showLanding' of undefinedlanding_app.js:15 (anonymous function)require.js:1658 context.execCbrequire.js:874 Module.checkrequire.js:1121 (anonymous function)require.js:132 (anonymous function)require.js:1164 (anonymous function)require.js:57 eachrequire.js:1163 Module.emitrequire.js:925 Module.checkrequire.js:1151 Module.enablerequire.js:782 Module.initrequire.js:1178 callGetModulerequire.js:1572 context.completeLoadrequire.js:1679 context.onScriptLoad
require.js:1903 Resource interpreted as Script but transferred with MIME type text/html: "http://localhost:8888/multikanban/scripts/apps/landing/show/show_controller.js".
使用 App.navigate("") 我只更新 URL,错误状态中不应该 "transferred"...
观察:
- App.navigate("") 在使用 pushState 之前有效。
- 将 App.navigate("") 更改为 App.navigate("a") 之类的内容可以使其正常工作,但当然 URL 是错误的..
- 评论 App.navigate("") 不会让应用程序崩溃,它根本不会更新 URL,所以是的,问题应该出在 App.navigate(" ")
如何让 App.navigate("") 工作?为什么该命令显然与服务器交互,它不应该只更新 URL 和历史记录吗?我可以在哪里询问这个问题?
您收到的错误似乎表明 requirejs 没有正确映射到您指定的路径。
好的,经过一番努力,我修复了它。显然,它与后面的更改无关,而是与上个月神秘工作的 requirejs 配置有关:D
我从
更改了 index.html 中的 data-main 和 src<script data-main="scripts/main.js" src="scripts/vendor/requirejs/require.js"></script>
至
<script data-main="/multikanban/app/scripts/main.js" src="/multikanban/app/scripts/vendor/requirejs/require.js"></script>
此外,如果您有样式,请确保在 href 中定义绝对路径。
干杯!
感谢@jdaudier 的帮助