【问题标题】:How to pass form data to another page?如何将表单数据传递到另一个页面?
【发布时间】:2017-01-20 19:10:22
【问题描述】:

我正在使用 angularJS v 1.5.6 并且想知道如何使用 $location.path 正确传递我的表单数据。

这是我的代码页面 A:

<form>
...
    <button type="submit" ng-click="submit(formData)">submit</button>
</form>

JS:

app.config(['$routeProvider', function ($routeProvider) {$routeProvider
// Home
.when("/", {
  templateUrl: "A.html", 
  controller: "ACtrl"
})
.when("/B/", {
  templateUrl: "B.html", 
  controller: "BCtrl"
})
  //fallback url if nothing matches
.otherwise({
  redirectTo: '/'
}); 
}]); 
app.controller('ACtrl', function ( $scope, $location, $http) {
$scope.formData = {};
$scope.submit = function() {
    $location.path("/B/" + $scope.formData );
};
});
//controller for B page
app.controller('BCtrl', ['$scope', '$routeParams',
function($scope,$routeParams) {

$scope.formData = $routeParams.formData;
}]);

这是一个非常简单的例子,但我不知道如何解决它:(

点击提交没有任何反应。如果我从 $scope.formData 中删除 $scope,我会收到如下错误:错误:formData 未定义。

formdata 中的术语可用,我用 console.log($scope.formData) 测试过,一切正常。

这里是链接插件:https://plnkr.co/edit/K5zwcmRRyom5HR4a5Q9o

编辑

现在唯一的问题是,如何在 foreach 循环中正确处理选择对象。需要帮助

【问题讨论】:

  • 使用 $scope 在页面之间传递数据是个坏主意。更好的是使用服务在不同页面之间共享/传递数据。您可以创建单独的服务 formStateService 并将其注入不同的控制器
  • 请创建一个plunker 以便我们进行编辑。
  • 好的,plunker 可用等。
  • 使用本地存储来实现这一点。
  • 知道如何解决选择对象的问题吗?

标签: javascript angularjs


【解决方案1】:

不要使用 location.path...

您可以使用服务或使用 localstorage(或其他浏览器存储机制 [sessionStorage, indexdb]。

服务方法如下

app.service("SomeService", function () {

    var value = null;

    this.set = function (val) {
        value = val;
        return this;
    }

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

app.controller("ACtrl", function ($scope, SomeService) {

    $scope.formData = {};
    $scope.submit = function() {

        //Assuming you've populated it with some data...
        SomeService.set($scope.formData);

        $location.path("/B/");
    };

})

app.controller("BCtrl", function ($scope, SomeService) {

    $scope.formData;

    (function () {

        //Check that the data is present in the SomeService service.
        var dataFromACtrl = SomeService.get();
        if (dataFromACtrl) {
            $scope.formData = dataFromACtrl;
        }
    })();
})

下面使用localStorage,可以是sessionStorage。

app.controller("ACtrl", function ($scope, SomeService) {

    $scope.formData = {};
    $scope.submit = function() {

    //Assuming you've populated it with some data...
        window.localStorage.setItem("form_data", JSON.stringify($scope.form_data));
        $location.path("/B/");
    };

})

app.controller("BCtrl", function ($scope, SomeService) {

    $scope.formData;

    (function () {
        var dataFromACtrl = window.localStorage.getItem("form_data");
        if (dataFromACtrl) {
            $scope.formData = JSON.parse(dataFromACtrl);
        }
    })();
})

注意

使用 localStorage 示例,您需要进行一些清理,在对 Bctrl 中的数据执行任何操作后,您需要使用以下任一代码行清除 localstorage 中的条目:

window.localStorage.removeItem("form_data");

delete window.localStorage["form_data"];

【讨论】:

  • 非常感谢您的回答,我试了一下,但它不起作用。重定向没问题,在我进入 /B/ 之后,我得到一个错误:错误:$scope 未定义
  • @JohnDoo 请再试一次,我错过了将“$scope”添加到两个控制器的依赖参数中。以上代码已更新。
  • jep,效果很好。只有一个问题,如何获得B页面的输出? {{formData}} 不起作用
  • 您在上面使用的是哪个代码?服务还是 localStorage 示例?在 BCtrl 的 if 语句中放置一个 console.log($scope.formData) 并查看控制台中显示的内容。
  • 我两个都试了。 console.log() 工作正常,但如果我尝试在第二页上执行此操作,我什么也得不到:
     data: {{ formData }} 
【解决方案2】:

您可以通过创建服务并使用 setter/getter 来传输变量来做到这一点。 比如像这样:https://plnkr.co/edit/IuTXsVLU7dq3TylfnSYP?p=preview

app.service('TransferService', [function(){

 var savedData,
 service = {
   getData: getData,
   setData: setData
 }

 function getData(){
   return savedData
 }

 function setData(data){
   savedData = data
 }

 return service
}])

【讨论】:

  • 感谢 Evt.V,它运行良好。唯一的问题是如上所述在下一页上获取 fromData 输出。有什么想法吗?
  • 为了在任何控制器中获取数据,您需要将此服务注入控制器并使用类似 var formData= TransferService.getData();或者我不明白你的问题?所有保存的数据都存储在关闭服务中。如果要呈现数据,可以将其分配给范围。例如 $scope.formData = TransferService.getData();我为你更新了 plnkr。
  • 非常感谢@Evt.V 我明白了。你能帮我把所有的值计算成一个总和吗?容易吗?如果不是,我很高兴为实现它的每一个提示或链接。谢谢!
  • 更新了插件。请参见计算控制。这样,如果它们是数字,您可以计算此对象中所有值的总和
  • 好的,我已将这些东西添加到我的 plunker 中。 plnkr.co/edit/K5zwcmRRyom5HR4a5Q9o?p=preview 问题是 selectoption 对象。在这里,他无法正确获取 id / 整数。其他术语效果很好,但选择是....
猜你喜欢
  • 2021-01-25
  • 1970-01-01
  • 2013-01-19
  • 1970-01-01
  • 2016-12-24
  • 2013-02-20
相关资源
最近更新 更多