2017-10-25 25 views
9

Tôi có một bảng điều khiển Kibana với URL:Góc mã hóa url trong ng-src và thay thế '/' bằng% 2F và '?' với% 3F

/logquery/app/kibana#/dashboard/Some-Dashboard?someParameters 

và tôi có một ứng dụng web mà tôi đang cố gắng để nhúng bảng điều khiển ở trên trong một . Url trong ứng dụng web như sau

/dashboards/logquery/app/kibana#/dashboard/Some-Dashboard?someParameters 

và trong AngularJs, tôi đang làm:

ctrl.dashboardUrl = $location.url().replace('/dashboards', ''); 

Theo quan điểm của tôi:

<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> 

trustAsUrl lọc như sau:

filtersGroup.filter('trustAsUrl', [ 
    '$sce', 
    function ($sce) { 
     return function (val) { 
      return $sce.trustAsResourceUrl(val); 
     }; 
    }]); 

một d Tôi có:

$locationProvider.html5Mode({ 
       enabled: true, 
       requireBase: false, 
       rewriteLinks: false 
      }); 

Điều này gây / ký tự sau /kibana# được thay thế bằng %2F? với %3F gây Kibana không để có thể tìm thấy bảng điều khiển yêu cầu.

Tôi làm cách nào để khắc phục điều này? Cảm ơn!

+0

sau đó không sử dụng 'lọc trustAsUrl', ' ng-src = "{{ctrl.dashboardUrl}}" ' –

+0

@MirazChowdhury Nó không tạo sự khác biệt. Theo hiểu biết của tôi, nó không phải là phần mã hóa url bảng điều khiển. –

+2

Bạn có thể thêm mã của bạn trên fiddle không? –

Trả lời

0

gì đang xảy ra là AngularJS là thao tác URL trong thanh địa chỉ của bạn, mà bạn đọc với $location.

Vì vậy, vấn đề không xảy ra sau khi bạn đọc url và đặt nó vào iframe với ngSrc nhưng khi góc điều khiển URL gốc trong thanh địa chỉ. Vì vậy, bạn có thể tự giải mã nó với decodeURIComponent()

return $sce.trustAsResourceUrl(decodeURIComponent(val)); 
+1

@ hasan-can-saral Cảm ơn bạn đã chỉnh sửa, giải thích tuyệt vời! – masterfloda

1

Có vẻ như vấn đề là với phương pháp vsprintf mà bạn đã bỏ lỡ trong câu hỏi câu hỏi của mình nhưng có trong mã fiddle. Tôi đã sửa đổi fiddle và sử dụng nội suy chuỗi javascript thay vì phương thức PHP vsprintf và nó trả lại URL chính xác.

Fix:

Trước

vsprintf("%s://%s/%s", [$location.protocol(), $location.host(), $location.url().replace('/dashboards', '')]); 

Sau

ctrl.dashboardUri = `${$location.protocol()}://${$location.host()}/${$location.url().replace('/dashboards', '')}` 
+0

Tôi xin lỗi điều này không đúng. Tôi sẽ ngạc nhiên nếu 'vsprintf' sẽ mã hóa URL. –

+0

Xin vui lòng kiểm tra fiddle, mà là không có vsprintf và làm việc hoàn hảo –

+0

Góc sẽ không thao tác các url trong fiddle. Nó hoạt động với vsprintf. –

Các vấn đề liên quan