Angular UI-router解析get promise会导致post请求变为null

时间:2015-06-02 10:12:51

标签: angularjs angular-ui-router

我使用angular v1.3.15和ui-router v0.2.8的Ui-router有问题。我已经设置了嵌套状态的路由,我正在解决使用数据加载视图的承诺,到目前为止一直很好。 我的问题出现在我解决以前保存的#34; work"并尝试添加新的"工作"通过POST请求我得到错误:"工作不能为空"。奇怪的是,当我不解决GET的承诺以显示流行的"工作"发布我的POST正在按预期工作(保存数据)。

我解决了将数据检索到其他视图的承诺,并且在那些视图中我可以毫无问题地执行PUT请求,我不明白我哪里出错了。虽然我是Angular的新手,可能会遗漏一些非常简单的东西......

我的app.js; (第一个州' home.edit'得到当前的应用程序,这是正常的,我的第二个状态是所有的工作'工作正常)

  .state("home.edit",
        {
            url: "/applications/edit/:applicationId",
            templateUrl: "app/applicationEdit/applicationEdit.html",
            controller: "applicationEditCtrl as vm",
            resolve:
                {
                applicationEditResource: "applicationEditResource",

                application: function (applicationEditResource, $stateParams)
                {
                    var applicationId = $stateParams.applicationId;

                    return applicationEditResource.get(
                        { applicationId: applicationId }).$promise;
                },


                }

        })
        .state("home.edit.work", {
            url: "/Work",
            templateUrl: "app/applicationEdit/applicationEditWork.html",
            controller: "workEditCtrl as vm",
            resolve:
                {
                    workEditResource: "workEditResource",

                    work: function (workEditResource) {


                        return workEditResource.get( ).$promise;

                    }

                },


        })

我的workEditResource;

返回$ resource(appSettings.serverPath +" api / works /:applicationId",null,

      {
          'get':
         {
             isArray: true,
             method: 'GET',
             headers: { 'Authorization': 'Bearer ' + currentUser.getProfile().token }
         },
          'save': {
              method: 'POST',
              headers: { 'Authorization': 'Bearer ' + currentUser.getProfile().token }
          }
      });

}

我的workEditCtrl;

.controller("workEditCtrl",
            ["application",
               "work",
                "workEditResource",
                workEditCtrl]);

function workEditCtrl(application, work, workEditResource) {
    var vm = this;
    vm.fail = '';
    vm.message = '';
    vm.work = work;
    vm.application = application;
    vm.work.applicationId = vm.application.applicationId;


    if (vm.work && vm.application.applicationId) {
        vm.title = "Hantera arbete " + vm.application.applicationId
    }



    //sparar nytt arbete med ansökans ID
    vm.submit = function () {
        vm.fail = '';
        vm.message = '';
        workEditResource.save(vm.work,
                function(data){
                    vm.message = "Nytt arbete sparat"
                }),
        function (response) {

            vm.fail = "Formuläret är inte korrekt ifyllt, var vänlig kontrollera uppgifterna och försök igen.";
        };
    }
}

}());

我的API控制器;

 public IHttpActionResult Post([FromBody] Work work)
    {
        try
        {
            if (work == null)
            {
                return BadRequest("Work can not be null");
            }
            if (!ModelState.IsValid)
            {
                return BadRequest(ModelState);
            }
            var workRepository = new Models.WorkRepository();
            var newWork = workRepository.Save(work);
            if (newWork == null)
            {
                return Conflict();
            }
            return Created<Work>(Request.RequestUri + newWork.WorkId.ToString(), newWork);
        }
        catch (Exception ex)
        {
            return InternalServerError(ex);
        }

    }

非常感谢任何关于我缺少的提示:)

1 个答案:

答案 0 :(得分:0)

POST旨在创建新记录,这似乎是您使用它的方式,但是在将work解析为之前的记录时,您传递给workEditResource.save的是现有记录,而不是新记录。

怀疑 $资源处理程序因工作对象中提供的ID而感到困惑,因此尝试POST到该工作ID的PUT URL,而不是POST到URL以进行创建新记录。

编辑:要解决此问题,您应该在控制器中为这两个变量使用单独的变量 - 可能vm.previousWork用于查看旧作品的数组,vm.work表示你正在创作的新作品。