【问题标题】:How to add mozSystem property to $http service in angular?如何以角度将 mozSystem 属性添加到 $http 服务?
【发布时间】:2014-09-24 22:21:21
【问题描述】:

在我的应用程序中将 jquery 更改为 angular,但不知道如何将此属性添加到服务 $http,在 jquery 中是这样的: var xhr = new XMLHttpRequest({mozSystem: true});

更多信息:

https://github.com/angular/angular.js/pull/7903#issuecomment-49966671

Firefox OS packaged apps and XMLHttpRequests

【问题讨论】:

    标签: angularjs xmlhttprequest firefox-os


    【解决方案1】:

    截至 2015 年 4 月 30 日(AngularJS v1.3.15)

    没有办法在angular中动态创建XHR对象,但正在讨论中。

    为 FxOS 修改 Angular

    这里是 Angular 的修补版本,只是它们的 XHR 已被修补以在 FxOS 上与 systemXHR 一起使用

    注意:请勿尝试将这些链接用作 CDN。

    解决方法

    https://angularjs.org/ 有一个 CDN 链接,您可以从中下载最新版本(这很好,因为无论如何您都要在设备上打包应用程序)。

    例如: * https://ajax.googleapis.com/ajax/libs/angularjs/1.3.15/angular.js

    您可能需要未压缩源,以便更容易使用。

    在文件中

    搜索XHRcreateXHRXMLHttpRequest,您会看到需要修补的功能。

    正如@jan 所说,您将替换看起来像的东西

    return new window.XMLHttpRequest()
    

    return new window.XMLHttpRequest({ mozSystem: true })
    

    您可以使用 uglify-js 缩小文件,下载并编辑缩小版(如果这对您来说不是太可怕的话),或者去突击队并使用未缩小版。

    【讨论】:

      【解决方案2】:

      你现在必须做一些框架黑客攻击。在 angular.js 文件中,查找

      var XHR = window.XMLHttpRequest || function() {
        try { return new ActiveXObject("Msxml2.XMLHTTP.6.0"); } catch (e1) {}
        try { return new ActiveXObject("Msxml2.XMLHTTP.3.0"); } catch (e2) {}
        try { return new ActiveXObject("Msxml2.XMLHTTP"); } catch (e3) {}
        throw new Error("This browser does not support XMLHttpRequest.");
      };
      

      并将其替换为:

      var XHR = function(){
        return new window.XMLHttpRequest({mozSystem: true});
      };
      

      【讨论】:

        【解决方案3】:

        你需要先配置HTTP头

        // Define HTTP header for .NET
        .config(function($httpProvider, $routeProvider){
            $httpProvider.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded; charset=utf-8';
            var param = function(obj){
                var query = '', name, value, fullSubName, subName, subValue, innerObj, i;
        
                for(name in obj){
                    value = obj[name];
        
                    if(value instanceof Array){
                        for(i=0; i<valuel.length; ++i){
                            subValue = value[i];
                            fullSubName = name + '[' + i +']';
                            innerObj = {};
                            innerObj[fullSubName] = subValue;
                            query += param(innerObj) + '&';
                        }
                    }
                    else if(value instanceof Object) {
                        for(subName in value) {
                            subValue = value[subName];
                            fullSubName = name + '[' + subName + ']';
                            innerObj = {};
                            innerObj[fullSubName] = subValue;
                            query += param(innerObj) + '&';
                        }
                    }
                    else if(value !== undefined && value !== null)
                        query += encodeURIComponent(name) + '=' + encodeURIComponent(value) + '&';
                }
        
                return query.length ? query.substr(0, query.length - 1) : query;
            };
        
            $httpProvider.defaults.transformRequest = [function(data){
                return angular.isObject(data) && String(data) !== '[object File]' ? param(data) : data;
            }];
        
        })
        

        一旦您配置了 HTTP 标头。您需要 HTTP 方法的 URL。 Angular 的 $HTTP 返回承诺。如果需要,您可以调用异步 HTTP 请求。

        这里是代码示例

        .service('PromisesQ',function AjaxService($http, $q){
            var ajaxService = this; 
        
            ajaxService.countTargetRecords = function countTargetRecords(targetXML){
                var AjaxURL =  url_dev;
                var AjaxData = 'InputParam1=input&InputParam2=anotherInput;
        
                return $http.post(AjaxURL, AjaxData)
                            .success(function(response){
                                return response;
                            })
                            .error(function(data, status, headers, config) {
                                console.log('[CountTargetRecords] Error '+ data);
                            })
            }
        

        希望这有帮助。

        【讨论】:

        • 这与提出的问题无关。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-04-18
        • 2014-12-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-30
        • 1970-01-01
        相关资源
        最近更新 更多