我使用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);
}
}
非常感谢任何关于我缺少的提示:)
答案 0 :(得分:0)
POST旨在创建新记录,这似乎是您使用它的方式,但是在将work
解析为之前的记录时,您传递给workEditResource.save
的是现有记录,而不是新记录。
我怀疑 $资源处理程序因工作对象中提供的ID而感到困惑,因此尝试POST到该工作ID的PUT URL,而不是POST到URL以进行创建新记录。
编辑:要解决此问题,您应该在控制器中为这两个变量使用单独的变量 - 可能vm.previousWork
用于查看旧作品的数组,vm.work
表示你正在创作的新作品。