【问题标题】:AngularJS $http.post(...).success is not a function with file upload method [duplicate]AngularJS $http.post(...).success 不是具有文件上传方法的函数[重复]
【发布时间】:2018-11-27 20:36:47
【问题描述】:

我正在尝试通过 angularjs Web 应用程序将新记录插入数据库,但问题是当我单击提交按钮时,我在控制台窗口中出现以下错误。我正在尝试从 angularjs 应用程序 throw wcf 服务发布数据。

 **TypeError: $http.post(...).success is not a function
        at Object.fac.UploadFile (Controllers.js:139)
        at Scope.$scope.SaveFile (Controllers.js:80)
        at fn (eval at compile (angular.js:15642), <anonymous>:4:144)
        at callback (angular.js:27463)
        at Scope.$eval (angular.js:18533)
        at Scope.$apply (angular.js:18632)
        at HTMLFormElement.<anonymous> (angular.js:27468)
        at defaultHandlerWrapper (angular.js:3785)
        at HTMLFormElement.eventHandler (angular.js:3773)**

这是我的 controller.js 代码。

app.controller("AngularJs_WCFController", function ($scope, $timeout, $rootScope, $window, AngularJs_WCFService, FileUploadService) {
    $scope.date = new Date();
    //  To set and get the Item Details values 
    var firstbool = true;
    $scope.Imagename = "";
    $scope.Item_ID = "0";
    $scope.Item_Name = "";
    $scope.Description = "";
    $scope.Item_Price = "0";
    $scope.txtAddedBy = "";
    // This is publich method which will be called initially and load all the item Details.  
    GetItemDetails();
    //To Get All Records    
    function GetItemDetails() {
        var promiseGet = AngularJs_WCFService.GetItemDetails();
        promiseGet.then(function (pl) {
            $scope.getItemDetailsDisp = pl.data
        },
            function (errorPl) {
            });
    }

    //Declarationa and Function for Image Upload and Save Data 
    //-------------------------------------------- 
    // Variables 
    $scope.Message = "";
    $scope.FileInvalidMessage = "";
    $scope.SelectedFileForUpload = null;
    $scope.FileDescription_TR = "";
    $scope.IsFormSubmitted = false;
    $scope.IsFileValid = false;
    $scope.IsFormValid = false;
    //Form Validation 
    $scope.$watch("f1.$valid", function (isValid) {
        $scope.IsFormValid = isValid;
    });

    // THIS IS REQUIRED AS File Control is not supported 2 way binding features of Angular 
    // ------------------------------------------------------------------------------------ 
    //File Validation 
    $scope.ChechFileValid = function (file) {
        var isValid = false;
        if ($scope.SelectedFileForUpload != null) {
            if ((file.type == 'image/png' || file.type == 'image/jpeg' || file.type == 'image/gif') && file.size <= (800 * 800)) {
                $scope.FileInvalidMessage = "";
                isValid = true;
            }
            else {
                $scope.FileInvalidMessage = "Only JPEG/PNG/Gif Image can be upload )";
            }
        }
        else {
            $scope.FileInvalidMessage = "Image required!";
        }
        $scope.IsFileValid = isValid;
    };
    //File Select event  
    $scope.selectFileforUpload = function (file) {

        var files = file[0];
        $scope.Imagename = files.name;
        alert($scope.Imagename);
        $scope.SelectedFileForUpload = file[0];

    }
    //---------------------------------------------------------------------------------------- 
    //Save File 
    $scope.SaveFile = function () {
        $scope.IsFormSubmitted = true;
        $scope.Message = "";
        $scope.ChechFileValid($scope.SelectedFileForUpload);
        if ($scope.IsFormValid && $scope.IsFileValid) {
            FileUploadService.UploadFile($scope.SelectedFileForUpload).then(function (d) {

                var ItmDetails = {
                    Item_ID: $scope.Item_ID,
                    Item_Name: $scope.Item_Name,
                    Description: $scope.Description,
                    Item_Price: $scope.Item_Price,
                    Image_Name: $scope.Imagename,
                    AddedBy: $scope.txtAddedBy
                };

                var promisePost = AngularJs_WCFService.post(ItmDetails);
                promisePost.then(function (pl) {
                    alert(p1.data.Item_Name);
                    GetItemDetails();
                }, function (err) {
                    // alert("Data Insert Error " + err.Message); 
                });
                alert(d.Message + " Item Saved!");
                $scope.IsFormSubmitted = false;
                ClearForm();

            }, function (e) {
                alert(e);
            });
        }
        else {
            $scope.Message = "All the fields are required.";
        }
    };
    //Clear form  
    function ClearForm() {
        $scope.Imagename = "";
        $scope.Item_ID = "0";
        $scope.Item_Name = "";
        $scope.Description = "";
        $scope.Item_Price = "0";
        $scope.txtAddedBy = "";

        angular.forEach(angular.element("input[type='file']"), function (inputElem) {
            angular.element(inputElem).val(null);
        });
        $scope.f1.$setPristine();
        $scope.IsFormSubmitted = false;
    }
})
    .factory('FileUploadService', function ($http, $q) {

        var fac = {};
        fac.UploadFile = function (file) {
            var formData = new FormData();
            formData.append("file", file);
            var defer = $q.defer();
            $http.post("/shanuShopping/UploadFile", formData,
                {
                    withCredentials: true,
                    headers: { 'Content-Type': undefined },
                    transformRequest: angular.identity
                })
                .success(function (d) {
                    defer.resolve(d);
                })
                .error(function () {
                    defer.reject("File Upload Failed!");
                });
            return defer.promise;
        }
        return fac;


    }); 

这是我运行应用程序时的屏幕截图..

【问题讨论】:

  • 在你的uploadFile函数中,不要做:.success().error(),试试:.then(successFunc, errorFunc)。听起来它不承认你创造的成功承诺。当您查看 HttpPromise 的属性时,您会发现没有您定义的成功函数。所以我认为then 功能可以解决您的问题。如果我的怀疑是正确的,请告诉我。
  • 还要避免使用defered Anti-pattern

标签: javascript sql angularjs


【解决方案1】:

从工厂删除deferred Anti-pattern

app.factory('FileUploadService', function ($http, $q) {
    var fac = {};
    fac.UploadFile = function (file) {
        var formData = new FormData();
        formData.append("file", file);
        ̶v̶a̶r̶ ̶d̶e̶f̶e̶r̶ ̶=̶ ̶$̶q̶.̶d̶e̶f̶e̶r̶(̶)̶;̶
        var promise = $http.post("/shanuShopping/UploadFile", formData,
            {
                withCredentials: true,
                headers: { 'Content-Type': undefined },
                transformRequest: angular.identity
            })
            .then(function(response) {
                return response.data;
            })
            .catch(function(error) {
                console.log("File Upload Failed!");
                return $q.reject(error);
            });
            //.success(function (d) {
            //    defer.resolve(d);
            //})
            //.error(function () {
            //    defer.reject("File Upload Failed!");
            //});
        return  ̶d̶e̶f̶e̶r̶.̶p̶r̶o̶m̶i̶s̶e̶;̶  promise;
    }
    return fac;
}); 

【讨论】:

  • 将 Stack 的代码编辑器提升到新的水平。你是怎么做三振出局的?
  • @Phil unicode text magic yaytext.com
  • 非常感谢。它正在工作@georgeawg
猜你喜欢
  • 2014-10-10
  • 1970-01-01
  • 2016-02-05
  • 2016-05-01
  • 1970-01-01
  • 2016-10-18
  • 2021-10-16
  • 1970-01-01
  • 2017-05-01
相关资源
最近更新 更多