角度提交仅表单数据而不是整个模型

时间:2016-06-16 15:32:36

标签: angularjs forms model

我将表单数据提交到我的API,但我的模型包含我的整个对象。我真的应该只提交更新,对吗?

所以,

  • 我的商品由 ID 检索,我不需要向用户展示(隐藏字段)。
  • 我会向用户显示项目的标题,以便他们知道他们正在编辑的内容,但我不会让它可编辑(只读)。< / LI>
  • 我会公开描述,以便用户可以编辑并保存。

(想象一下更大的形式 - 六个以上的只读字段和六个可编辑的字段。)

如果我错了,请纠正我,但是,当发送到我的API时,我不应该发送整个项目对象。数据库已经有了标题,为什么要把它放在有效负载中它会被扔掉?

所以,我应该只发送可编辑字段的值。

我试图找出将模型与表单数据分开的正确方法,因此我提交后者,而不是前者。如果这是最佳实践,请指正。

控制器:

.controller('editItemController', ['$stateParams', 
function($stateParams) {
    var vm = this;

        vm.getItem = function () {
            $http.get('/api/Items/' + $stateParams.id).then(function (response) {
                vm.item = response.data;
            });
        };
        vm.saveChanges = function () {
            vm.submitted = true;

            if (vm.detailsForm.$valid) {

                $http.put('/api/Items/' + $stateParams.id, vm.item).then(function (response) {

                });
            }

        };

    vm.getItem();
}

查看:

<form name="itemVm.detailsForm" ng-controllerAs="itemVm">
        <input type="hidden" name="Id" ng-model="itemVm.item.Id" />

        <div class="form-group">
            <label for="title" class="control-label col-xs-3">Title:</label>
            <div class="col-xs-9">
                <input type="text" class="form-control" readonly="readonly" id="title" value="{{ itemVm.item.Title }}">
            </div>
        </div>

        <div class="form-group">
            <label for="description" class="control-label col-xs-3">Description:</label>
            <div class="col-xs-9">
                <input type="text" class="form-control" name="description" ng-model="itemVm.item.Description" required>
            </div>
        </div>
        <button ng-click="itemVm.saveChanges()">Save Changes</button>
    </form>

1 个答案:

答案 0 :(得分:0)

对于标准REST API,您应该发送整个对象。 REST背后的整个想法是你转移对象状态的表示,从而表示状态转移。因此,它应该是一个完整的表示,而不是一部分。

如果您真的喜欢,有多种方法可以避免这种情况,而且大部分方法都与后端有关,而不是前端。

创建一个ad hoc端点以接收一个参数并相应地更新持久对象。 (不推荐)。

如果你想发送部分数据(根据对象的大小,我认为这是一个好主意),你应该相应地在后端处理它。

请参阅here