(解决跨域)自定义服务wmxHttp,自定义jsonp

2017-10-14  本文已影响0人  小草莓蹦蹦跳
   // 方法:给服务器返回的数据调用(不能出现点;方法随机)
      //注入$window服务
    app.service('wmxHttp',['$window',function ($window) {
        /**
         * 跨域请求数据
         * @param url 请求地址
         * @param params  请求参数
         * @param fn 请求成功的回调
         */
        this.jsonp = function (url, params, fn) {
            /**
             * 跨域的步骤
             * 1. 在本地创建一个函数并随机生成函数名
             * 2. 通过src属性请求网络,把本地的函数名传递过去
             * @type {string}
             */
            // 1. 回调函数的名字(随机生成,且不能还有小数点)
            var callBackName = 'wmx_callback'+ Math.random().toString().slice(2);

            // 2. 通过$window创建一个callback的函数
            $window[callBackName] = function (args) {
                fn(args);
                // 获得数据后,动态创建的script标签没有存在的必要,可以移除
                $window.document.body.removeChild(newScript);
            };

            // 3. 动态的创建一个script节点
            var newScript = $window.document.createElement('script');

            // 4. 往script标签插入src
               // 01.参数的拼接
              var res = '';
              for(var key in params){
                res += key + '=' + params[key] + '&';
              }

                // 02. 完整地址的拼接(src属性请求网络的值)
                res = url + '?' + res + 'callback=' + callBackName;

                // 03. 给src赋值
                newScript.src = res;

            // 5. 插入到dom节点下
            $window.document.body.appendChild(newScript);
        }
    }])
    // 注入一个$routeParams服务
    // 注入服务baseUrl,注意写在$http的前面
    // 注入服务apiKey
    // 注入自定义服务wmxHttp
    app.controller('musicController',['$scope','$routeParams','baseUrl','apiKey','wmxHttp',function ($scope,$routeParams,baseUrl,apiKey,wmxHttp) {

        // 通过服务器获得type值
        var type = $routeParams.type;

       // 确定对应服务器的地址(先准备好下面要的参数)
        var url = baseUrl + type;
        var params = {
            apiKey:apiKey,
           //默认每次加载20条数据,修改每次加载条数
            start:0,
            count:4
        };

        //自定义服务wmxHttp
        /**
         * url 请求的地址
         * params 请求的参数
         * fn 回调函数
         */
        wmxHttp.jsonp(url,params,function (res) {
             //获取到数据
            $scope.data = res;
            console.log($scope.data);
            //更新页面显示(脏值检测的原理)
            $scope.$apply();
        })
    }]);
上一篇 下一篇

猜你喜欢

热点阅读