Angularjs 直接调用局部时的角度载荷主模板

Angularjs 直接调用局部时的角度载荷主模板,angularjs,laravel-5,Angularjs,Laravel 5,我正在用AngularJS和Laravel构建一个应用程序,用于API交互。我有一个主模板文件,比如index.html,里面有ng视图 客户列表视图的URL:http://example.com/#customers其中客户是部分视图url 后来我将应用程序切换到HTML5模式,这样我就可以不用部分调用它,例如http://example.com/customers 问题 如果在Angular范围内调用它,它确实可以工作,但是如果我直接调用URL,它只会加载customers list vie

我正在用AngularJS和Laravel构建一个应用程序,用于API交互。我有一个主模板文件,比如
index.html
,里面有
ng视图

客户列表视图的URL:
http://example.com/#customers
其中客户是部分视图url

后来我将应用程序切换到HTML5模式,这样我就可以不用
部分调用它,例如
http://example.com/customers

问题 如果在Angular范围内调用它,它确实可以工作,但是如果我直接调用URL,它只会加载customers list view HTML片段(没有主模板和脚本)并中断应用程序


有什么办法解决这个问题吗?

好的,我会尽力回答,因为评论时间太长了

我是AngularJS的新手,但就我所能解释的你的描述而言,你在前端应用程序中使用的功能URL与API中的相同。不同之处在于,API由web服务器提供服务,而前端页面由Angular提供服务

因此,为了简单起见,我假设您的初始角度页面(
index.html
)可以通过主URL(例如
www.example.com
)访问。
example.com
的所有子域仅用于API调用。这意味着,如果您在前端应用程序中切换页面,Angular将捕获此URL状态更改,并通过执行后台请求(AJAX)提供您所请求的任何内容,但这也意味着您的
index.html
仍显示在浏览器中(带有另一个子视图ofc)

通过刷新页面(或直接调用URL),您要求服务器提供完全不同的资源。显然,
www.example.com
提供的服务不同于
www.example.com/api/random/resource
。在浏览器中没有
index.html
loadet之前,Angular也不会加载,并且无法捕获URL状态更改以防止默认浏览器行为(即从服务器准确请求此资源)。因此,从服务器的角度来看,您不是请求主页,而是请求一个API资源

所以我建议的解决方案是非常直接的。正如我已经提到的,我本人是AngularJS新手,但据我所知(并且可以在web上阅读),Angular在后台使用AJAX调用(有意义,是吗?)。因此,您可以在您的Laravel应用程序中简单地使用中间件,它决定请求是否基于AJAX。如果不是AJAX调用,那么该中间件可以提供主页(而不更改实际URL!)。接下来,Angular应用程序仍将请求的URL作为状态,并可以提供您实际希望它提供的任何服务


我不能向您提供任何代码,因为我现在没有时间,但我认为您并不真正需要那么多,而且据我记忆所及,已经有一个中间件处理一些AJAX内容。。。也许你可以看看这个。如果您在代码中找到了解决方案,请随意分享

经过研究,我发现最合适的方法是使用
.htaccess
路由到主模板。下面将完成这项工作

RewriteEngine on
    RewriteCond %{REQUEST_FILENAME} -s [OR]
    RewriteCond %{REQUEST_FILENAME} -l [OR]
    RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^(.*) index.html [NC,L]

所以您的问题是不能使用f5进行刷新?基本上这是正常的行为,因为您的Web服务器只知道该URL的客户列表响应。这是一个角度,防止浏览器直接加载URL。我唯一能想到的是让laravel确定它是ajax请求还是普通请求,并给出不同的内容(例如,如果不是ajax请求,则始终显示主页)。@Namoshek laravel仅用作API,它与前端应用程序解耦。我不知道你是如何理解整个问题的:)