0

我的应用程序中有多个步骤表单,我想在进行下一步之前保存它......我做了一个简单的例子,但我不确定它是否是正确的方法。我使用解析配置和服务来访问 formData。

配置

app.config(function($stateProvider, $urlRouterProvider) {

            $urlRouterProvider.otherwise("/");

          $stateProvider
            .state('home', {
                url : '/',
                controller : 'appCtrl',
                templateUrl : 'partials/home.html',
                resolve : {
                    saveform : function($state, FormData){

                    }
                },
            })
               .state('home.state1', {
                    url: "state1",
                    templateUrl : 'partials/item1.html',
                    resolve : {
                        saveform : function($state, FormData){
                            return FormData.save();
                        }
                    },
                })
                .state('home.state2', {
          url: "state2",

          templateUrl : 'partials/item2.html',
          resolve : {
            saveform : function($state, FormData){

              return FormData.save();

            } 
          }
                })

        });

控制器

app.controller('appCtrl', function($scope, $rootScope, $state, saveform, FormData){
        $scope.formData = {};
        $scope.tempData = {};

        $rootScope.$on('$stateChangeStart', function(event){

            console.log($scope.tempData , $scope.formData)

            if(!_.isEqual($scope.tempData , $scope.formData)){
                console.log('OK CHANGE DETECTED, SAVE')

                var temp = {}

                FormData.set(angular.copy($scope.formData));

            }else{
                console.log('NO CHANGE')
            }

        });

        $rootScope.$on('$stateChangeSuccess', function(event){
            var temp = FormData.get();

            if(Object.keys(temp).length!=0){
                FormData.cancel();
                angular.copy(temp, $scope.tempData );
                angular.copy(temp, $scope.formData );
            }
        });

    })

服务

app.service('FormData', function($q, $timeout){
        this.formdata = {};

        this.save = function(){
            if(Object.keys(this.formdata).length===0) 
                return false;

            var deferred = $q.defer();

            $timeout(function() {
                this.formdata.test = "YEAH TEST";
                deferred.resolve(this.formdata);
                //this.formdata = {};
            }.bind(this), 1000);

            return deferred.promise;

        }

        this.cancel = function(){
            this.formdata = {};
        }

        this.set = function(data){
            this.formdata = data;
        }

        this.get = function(){
            return this.formdata;
        }
    })

codepen 示例:http ://codepen.io/anon/pen/RWpZGj

4

1 回答 1

0

我会以不同的方式处理这个问题。

您正在为一个表单使用多个状态。通常您只想保存完整的表单数据。因此,我会将表单分成多个部分,您可以显示/隐藏。这样,单击“下一步”按钮后,您可以分别验证每个步骤,并在当前步骤有效后显示下一步。

完成表单的最后一步后,您可以一次性保存整个内容。

如果您坚持使用单独的状态:

您正在使用状态更改来触发保存操作。相反,请使用 FormData 服务的响应来触发 statechange。这样,您可以在继续下一步之前验证并保存数据。当有人移动到不在您的多步骤表单中的另一个状态时,它还会阻止您保存数据。

于 2015-10-07T11:50:21.093 回答