【问题标题】:Angular UI-router resolving get promise causes post request to become nullAngular UI-router解析get promise导致post请求变为null
【发布时间】:2015-06-02 10:12:51
【问题描述】:

我对使用 angular v1.3.15 和 ui-router v0.2.8 的 Ui-router 有疑问。我已经设置了嵌套状态的路由,并且我正在解决使用数据加载视图的承诺,到目前为止一切都很好。 当我解决一个承诺以显示以前保存的“工作”并尝试通过 POST 请求添加新的“工作”时,我的问题出现了,我收到错误:“工作不能为空”。奇怪的是,当我没有解决 GET 的承诺以显示以前的“工作”帖子时,我的 POST 正在按预期工作(保存数据)。

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

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

  .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;

                    }

                },


        })

我的工作编辑资源;

return $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 }
          }
      });

}

我的工作EditCtrl;

.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);
        }

    }

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

【问题讨论】:

  • 您能否在 Chrome 中运行有问题的功能并使用开发工具监控网络流量,以查看发布到服务器的数据包含哪些“工作”对象?
  • 我收到了您的回复,其中包含所有“工作”帖子的数组,因此 $resource 被混淆的假设似乎是正确的 :)

标签: angularjs angular-ui-router


【解决方案1】:

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

怀疑 $resource 处理程序被工作对象中提供的 ID 弄糊涂了,因此尝试 POST 到该工作 ID 的 PUT URL,而不是 POST 到用于创建的 URL新纪录。

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

【讨论】:

  • 是的,我相信你是对的,因为 $resource 变得混乱,但是 PUT 请求并没有解决问题。
  • @Lisa 您是否在加载以前的“作品”时尝试更新或创建记录?
  • 我只加载以前的工作,然后在输入表单上方的表格中查看。我使用 applicationId 将其与应用程序匹配(在该应用程序上添加了“工作”)所以我要做的是将关联的“工作”帖子加载到一个特定的应用程序以供查看,并且仍然有可能添加新的“与所述应用程序相关联的工作帖子。
  • @Lisa 我认为您应该在控制器中为这两个变量使用单独的变量 - vm.previousWork 用于查看旧作品的数组,而 vm.work 用于您正在创建的新作品。
  • @Lisa 我已更新我的答案以包含该解决方案,如果您对解决方案感到满意,请标记为已接受。
猜你喜欢
  • 1970-01-01
  • 2013-12-04
  • 1970-01-01
  • 2014-07-24
  • 1970-01-01
  • 2016-11-25
  • 2022-01-06
  • 1970-01-01
  • 2017-06-05
相关资源
最近更新 更多