当前位置: 首页 > 面试题库 >

在Ionic(Cordova)的新窗口/ inAppBrowser中发布表单

温举
2023-03-14
问题内容

我想向 外部网址 提交结帐 表单,该表单应打开带有结果的新窗口
,但是我无法使我的应用程序打开它,也无法在单独的窗口中打开它,也无法使用应用程序内浏览器。

到目前为止,我要做的是创建一个内部形式的指令,并通过链接器函数在某个时候调用Submit元素。

当我在浏览器中运行时,这会打开一个新窗口(就像我想要的一样)。 这个问题 时,会出现 在设备上运行 ,因为它只是 REPLACES
内容 我有新的内容视图 ,而无需打开 一个 对外的窗口

因此,问题是…在设备上运行时,如何发布此表单以打开新窗口(导航器)或应用内浏览器,并在那里显示结果?

谢谢!!


问题答案:

好吧,要弄清楚它很复杂,但是最后解决方案很“简单”。我将其张贴在这里,以帮助遇到相同问题的其他任何人。如果有人有更优雅的解决方案,它将受到欢迎。

我结束的工作是:

  1. 用我自己的带有angular和表单的模板打开新窗口。
  2. 在新的窗口控制器中,在全局窗口对象中创建一个回调函数
  3. 在旧窗口中,在loadstop事件之后,执行该回调
  4. 在新窗口中发布的表单将重定向到目标页面(这就是我想要的)。

这是代码(请注意,我正在使用带有格式的指令,因此我可以控制何时从链接函数提交它,并且数据通过服务与该指令共享):

angular.module('starter', ['ionic'])





.constant('cartData', {

        redirectUrl: 'https://test.mycart.com/hpp/pay.shtml',

        redirectMethod: 'POST',

        redirectData: {

                'formParam1': 'value1',

                'formPara2': 'value2'

            }

    }

)





.controller('InitCtrl', function($cordovaInAppBrowser, $scope, cartData) {



    $scope.openView = function(){



        var counter = 0;

        if(ionic.Platform.isWebView()){



            $ionicPlatform.ready(function() {

                //this is the cordova in app web view

                var ref = $cordovaInAppBrowser.open('payment.html', '_blank', {location:'yes'});



                $rootScope.$on('$cordovaInAppBrowser:loadstop', function(e, event){

                    if(counter < 1){

                        //prevent the callback to be called several times

                        $cordovaInAppBrowser.executeScript({

                            code: 'window.paymentCallback('+ angular.toJson(cartData) +');'

                        });

                        counter++;

                    }

                });

            });

        }

    };



})









//and then in payment.js





window.paymentCallback = null;



angular.module('payment', [])





.directive('autoSubmitForm', ['$timeout', 'autoSubmitFormDelegate', function($timeout, autoSubmitFormDelegate) {

    return {

        replace: true,

        scope: {},

        template: '<form action="{{formData.redirectUrl}}" method="{{formData.redirectMethod}}">'+

                      '<div ng-repeat="(key,val) in formData.redirectData">'+

                           '<input type="hidden" name="{{key}}" value="{{val}}" />'+

                      '</div>'+

                  '</form>',

        link: function($scope, element, $attrs) {



            autoSubmitFormDelegate.submitCallback = function(data) {

                $scope.formData = data;

                $timeout(function() {

                    element[0].submit();

                });

             };

        }

    }

}])



.factory('autoSubmitFormDelegate', function(){

    var delegate = {};



    delegate.submitCallback = null;



    delegate.submitForm = function(data){

        if(delegate.submitCallback){

            delegate.submitCallback(data);

        }

    }



    return delegate;

})



.controller('PaymentCtrl', function($scope, $timeout, $window, $sce, autoSubmitFormDelegate){





    $window.paymentCallback = function(data){

        console.log("callback called");

        data.redirectUrl = $sce.trustAsResourceUrl(data.redirectUrl);

        $timeout(function(){

            autoSubmitFormDelegate.submitForm(data);

        });

    };



})


<link href="http://code.ionicframework.com/1.1.1/css/ionic.min.css" rel="stylesheet">

<script src="http://code.ionicframework.com/1.1.1/js/ionic.bundle.min.js"></script>





<body ng-app="starter">



  <ion-view view-title="Init">

  <ion-content>

    <h1>Init</h1>

      <button class="button button-positive" ng-click="openView()">Open new view</button>

  </ion-content>

</ion-view>



</body>







<script type="text/ng-template" id="payment.html">



<html>

  <head>

    <meta charset="utf-8">

    <meta name="viewport" content="initial-scale=1, maximum-scale=1, user-scalable=no, width=device-width">

    <meta http-equiv="Content-Security-Policy" content="default-src *; style-src 'self' 'unsafe-inline'; script-src 'self' 'unsafe-inline' 'unsafe-eval'">

    <title></title>



    <script src="../lib/angular/angular.min.js"></script>

    <script src="../js/payment.js"></script>

  </head>



  <body ng-app="payment" ng-controller="PaymentCtrl">

    <auto-submit-form></auto-submit-form>

  </body>

</html>



</script>


 类似资料:
  • 以下代码在Android中运行良好。但是,它在IOS中不起作用。 我们认为是浏览器。executeScript在此不工作。在这里,我们从API获取重定向url作为html内容(this.paymentGatewayDetails),我们需要打开它。它在android中运行良好。 > 在IOS 11.0手机中尝试此操作。 离子2.2版 插件@ionic native/应用内浏览器“^4.3.2” 这

  • 主要内容:$ionicModal,ionicModal,实例$ionicModal $ionicModal 可以遮住用户主界面的内容框。 你可以在你的 index 文件或者是其他文件内嵌入以下代码(里面的代码可以根据你自己的业务场景相应的改变)。 然后你就可以在你的 Controller 里面的注入 $ionicModal 。然后调用你刚刚写入的模板,进行初始化操作。就像下面的代码: 方法 参数 类型 详情 templateString 模板的字符串作为模

  • $ionicModal $ionicModal 可以遮住用户主界面的内容框。 你可以在你的 index 文件或者是其他文件内嵌入以下代码(里面的代码可以根据你自己的业务场景相应的改变)。 <script id="my-modal.html" type="text/ng-template"> <ion-modal-view> <ion-header-bar> <h1>My

  • 问题内容: 我的应用程序中的一个页面具有一组链接,这些链接在单击时会基于TableTools jQuery插件发布表单数据。我想在一个新窗口中打开这个新页面。关于最佳方法的任何想法?我宁愿不将所有操作链接都更改为单个表单和用法。我尝试过调用一个新窗口以成功打开,然后将数据写入此页面,但这没有用。请帮忙! HTML: Javascript: 问题答案: 找到了答案: jQuery.ajax成功回调函

  • phonegap/cordova的文档非常糟糕。我只想在Windows环境中安装PhoneGap 3.0,但没有成功。 下面是我的步骤和失败点。有人能就解决方案提出建议吗? 根据说明: 安装Node.js(成功) 从nodes.js:(SUCCESSFUL) 添加平台:(什么都没发生) 尝试phonegap:(找不到ERROR项目目录) 来自“Windows Phone 8平台指南” 安装Wind

  • 测试:测试 用户代理:Mozilla/5.0(Linux;Android 4.4.2;SCH-I535 Build/KOT49h)AppleWebKit/537.36(KHTML,like Gecko)版本/4.0 Chrome/30.0.0.0 Mobile Safari/537.36 查询字符串参数client_id=XXX-OH7O4CMAJU3JGPRLLLN97NF0P3PC1F91.a