我有一个像我这样的小型AngularJs应用程序:
// html// app.js concernsApp.factory('ConcernService', function ($http, $q) { ... update: function (obj_url, obj) { var defer = $q.defer(); console.log(obj) $http({method: 'POST', url: api_url + obj_url + obj.id + '/', data: obj}). success(function (data, status, headers, config) { defer.resolve(data); }).error(function (data, status, headers, config) { defer.reject(status); }); return defer.promise; }, }); concernsApp.controller('ProjectsCtrl', function ($scope, $http, ConcernService) { $scope.updateTask = function(obj) { ConcernService.update('tasks/', obj).then(function(){ ... } });{{ project.id }}
{{ project.title }}
{{ task.id }}. {{ task.title }}
Create a New Task
问题是更新任务并保持父项目不变.如果我更改父项目,一切正常.如果我使用相同的父项目,那么我得到:
TypeError: Converting circular structure to JSON
我不完全确定这里发生了什么.
所以,我可以解决这个问题:
$scope.updateTask = function(obj) { parentProject = {'id': obj.project.id}; obj.project = parentProject; ConcernService.update('tasks/', obj).then(function(){ ... }); };
这是有效的,因为我实际上只需要task.project.id
更新对象.我认为问题是由于该任务引用了一个父项目,而该项目反过来引用了子任务等等.我对此并不完全确定.
但是,这个解决方案对我来说似乎有些苛刻,我希望看到更好的解决方案.
在某处你试图将一个对象转换为JSON,并且在其中有一个循环引用,意思是这样的:
var myObj = new Object(); myObject.reference = myObj;
现在尝试将其转换为JSON将失败,并产生您的错误.
查看您编辑的帖子,您的数据结构如下所示:
task.parent -> {project} project.tasks -> [{task1},{task2},...]
这应该建模关系"项目有多个任务"和"任务属于一个项目".
由于循环引用,现在显然不能转换为json格式.
对于数据结构,为什么不选择:
project = { "id": 42, "tasks": [123, 124, 127, ... ], } task = { "id": 123, "idproject": 42, ... }
每当您必须在angularjs应用程序中显示关系时,您可以使用过滤器.如果要显示属于项目的内容,请按projectid过滤所有任务.
或者通过请求后端对特定项目ID具有哪些任务,即时检索后端所需的数据.
这是一种方法.当然,让后端接受适当的更新请求也会起作用,例如更新项目需要项目ID和一系列任务ID.