Angular对ng-src中的url进行编码,并用%2F和'?'替换'/' 与%3F

Has*_*ral 8 javascript encoding urlencode angularjs kibana

我有一个带URL的Kibana仪表板:

/logquery/app/kibana#/dashboard/Some-Dashboard?someParameters
Run Code Online (Sandbox Code Playgroud)

我有一个Web应用程序,我试图在上面嵌入仪表板<iframe>.Web应用程序中的URL如下所示

/dashboards/logquery/app/kibana#/dashboard/Some-Dashboard?someParameters
Run Code Online (Sandbox Code Playgroud)

在AngularJs中,我正在做:

ctrl.dashboardUrl = $location.url().replace('/dashboards', '');
Run Code Online (Sandbox Code Playgroud)

在我看来:

<div ng-controller="DashboardCtrl as ctrl">
    <div class="iframe-container">
        <iframe ng-src="{{ctrl.dashboardUrl | trustAsUrl}}"
                height="100%"
                width="100%"
                ng-cloak
                frameborder="0"
                marginheight="0"
                marginwidth="0"></iframe>
    </div>
</div>
Run Code Online (Sandbox Code Playgroud)

trustAsUrl 过滤器如下:

filtersGroup.filter('trustAsUrl', [
    '$sce',
    function ($sce) {
        return function (val) {
            return $sce.trustAsResourceUrl(val);
        };
    }]);
Run Code Online (Sandbox Code Playgroud)

我有:

$locationProvider.html5Mode({
                enabled: true,
                requireBase: false,
                rewriteLinks: false
            });
Run Code Online (Sandbox Code Playgroud)

这会导致/后面的字符/kibana#与被替换%2F,并?%3F导致Kibana没有能够找到所需的仪表板.

我怎么能克服这个?谢谢!

mas*_*oda 0

发生的事情是 AngularJS 正在操纵地址栏中的 URL,您可以使用$location.

所以问题不是在你读取url并将其放入with中之后发生的iframengSrc而是当Angular在地址栏中操作原始URL时发生的。所以你可以使用decodeURIComponent()手动解码它

return $sce.trustAsResourceUrl(decodeURIComponent(val));
Run Code Online (Sandbox Code Playgroud)