Angularjs 在爱奥尼亚(Cordova)的新窗口/应用浏览器中发布表单

Angularjs 在爱奥尼亚(Cordova)的新窗口/应用浏览器中发布表单,angularjs,cordova,ionic-framework,ionic,Angularjs,Cordova,Ionic Framework,Ionic,我想将签出表单提交到一个外部url,该url将打开一个新窗口,显示结果,但我无法使我的应用程序在单独的窗口中打开它,也无法使用应用程序内浏览器 到目前为止,我所做的是创建一个包含表单的指令,并从链接器函数在某个点调用submit元素 当我在浏览器中运行时,会打开一个新窗口(如我所愿)当在设备上运行时出现问题,因为它只用新内容替换我视图中的内容,而不打开外部窗口 所以,问题是。。。在设备上运行时,如何在打开新窗口(导航器)或应用程序浏览器时发布此表单,并在其中显示结果 谢谢 嗯,解决这个问题很复杂

我想将签出表单提交到一个外部url,该url将打开一个新窗口,显示结果,但我无法使我的应用程序在单独的窗口中打开它,也无法使用应用程序内浏览器

到目前为止,我所做的是创建一个包含表单的指令,并从链接器函数在某个点调用submit元素

当我在浏览器中运行时,会打开一个新窗口(如我所愿)在设备上运行时出现问题,因为它只用新内容替换我视图中的内容,而不打开外部窗口

所以,问题是。。。在设备上运行时,如何在打开新窗口(导航器)或应用程序浏览器时发布此表单,并在其中显示结果


谢谢

嗯,解决这个问题很复杂,但最终解决方案“相当”简单。我将把它贴在这里,以帮助其他面临同样问题的人。如果有人有一个更优雅的解决方案,它将受到欢迎

我最后做的是:

  • 用angular和my form的我自己的模板打开新窗口
  • 在新窗口控制器中,在全局窗口对象中创建回调函数
  • 在loadstop事件之后,从旧窗口执行该回调
  • 在新窗口中发布的表单将重定向到目标页面(这正是我想要的)
  • 下面是代码(请注意,我在表单中使用了一个指令,因此我可以从link函数控制何时提交它,并且数据通过服务与指令共享):

    angular.module('starter',['ionic']))
    .constant('cartData'{
    重定向URL:'https://test.mycart.com/hpp/pay.shtml',
    重定向方法:“POST”,
    重定向数据:{
    'formParam1':'value1',
    “formPara2”:“value2”
    }
    }
    )
    .controller('InitCtrl',函数($cordovaInAppBrowser,$scope,cartData){
    $scope.openView=function(){
    var计数器=0;
    if(ionic.Platform.isWebView()){
    $ionicPlatform.ready(函数(){
    //这是cordova应用程序内的web视图
    var ref=$cordovaInAppBrowser.open('payment.html','u blank',{location:'yes'});
    $rootScope.$on(“$cordovaInAppBrowser:loadstop”,函数(e,事件){
    如果(计数器<1){
    //防止多次调用回调
    $cordovaInAppBrowser.executeScript({
    代码:“window.paymentCallback('+angular.toJson(cartData)+');”
    });
    计数器++;
    }
    });
    });
    }
    };
    })
    //然后在payment.js中
    window.paymentCallback=null;
    角度模块('付款',[]))
    .directive('autoSubmitForm',['$timeout','autoSubmitFormDelegate',函数($timeout,autoSubmitFormDelegate){
    返回{
    替换:正确,
    作用域:{},
    模板:“”+
    ''+
    ''+
    ''+
    '',
    链接:函数($scope,element,$attrs){
    autoSubmitFormDelegate.submitCallback=函数(数据){
    $scope.formData=数据;
    $timeout(函数(){
    元素[0]。提交();
    });
    };
    }
    }
    }])
    .factory('autoSubmitFormDelegate',函数(){
    var delegate={};
    delegate.submitCallback=null;
    delegate.submitForm=函数(数据){
    if(委托.提交回调){
    委托。提交回拨(数据);
    }
    }
    返回代表;
    })
    .controller('PaymentCtrl',函数($scope、$timeout、$window、$sce、autoSubmitFormDelegate){
    $window.paymentCallback=函数(数据){
    log(“调用回调”);
    data.redirectUrl=$sce.trustAsResourceUrl(data.redirectUrl);
    $timeout(函数(){
    autoSubmitFormDelegate.submitForm(数据);
    });
    };
    })
    
    初始化
    打开新视图
    
    好吧,解决这个问题很复杂,但最终解决方案“相当”简单。我将把它贴在这里,以帮助其他面临同样问题的人。如果有人有一个更优雅的解决方案,它将受到欢迎

    我最后做的是:

  • 用angular和my form的我自己的模板打开新窗口
  • 在新窗口控制器中,在全局窗口对象中创建回调函数
  • 在loadstop事件之后,从旧窗口执行该回调
  • 在新窗口中发布的表单将重定向到目标页面(这正是我想要的)
  • 下面是代码(请注意,我在表单中使用了一个指令,因此我可以从link函数控制何时提交它,并且数据通过服务与指令共享):

    angular.module('starter',['ionic']))
    .constant('cartData'{
    重定向URL:'https://test.mycart.com/hpp/pay.shtml',
    重定向方法:“POST”,
    重定向数据:{
    'formParam1':'value1',
    “formPara2”:“value2”
    }
    }
    )
    .controller('InitCtrl',函数($cordovaInAppBrowser,$scope,cartData){
    $scope.openView=function(){
    var计数器=0;
    if(ionic.Platform.isWebView()){
    $ionicPlatform.ready(函数(){
    //这是cordova应用程序内的web视图
    var ref=$cordovaInAppBrowser.open('payment.html','u blank',{location:'yes'});
    $rootScope.$on(“$cordovaInAppBrowser:loadstop”,函数(e,事件){
    如果(计数器<1){