2013-11-28 52 views
11

हाय करने के लिए परिपत्र संरचना परिवर्तित मैं तो जैसे एक छोटे कोणीय एप्लिकेशन है:कोणीय लेखन त्रुटि: JSON

// html 

<div ng-repeat="project in projects"> 
    <h3>{{ project.id }}</h3> 
    <h3>{{ project.title }}</h3> 
     <div ng-repeat="task in project.tasks"> 
      <h4>{{ task.id }}. {{ task.title }}</h4> 
      <button class="btn btn-default" ng-click="showEditTask=true">Edit Task</button> 
      <div class="box row animate-show-hide" ng-show="showEditTask"> 

       <h2>Create a New Task</h2> 
       <form name="newTaskForm" class="form-horizontal"> 
        Title: <br /> 
        <input ng-model="new_task.title" type="text" id="title" name="title" class="form-control" placeholder="Title" required /><br /> 

        Project: <br /> 
        <select ng-model="new_task.project" ng-options="project.title for project in projects" class="form-control"></select><br> 
       </form> 

        <button class="btn btn-success" ng-click="createTask(new_task)" ng-disabled="!newTaskForm.title.$valid">create</button> 
      </div> 
     </div> 
</div> 


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

समस्या एक कार्य को अपडेट करने और माता पिता के परियोजना छोड़ने के रूप में साथ है। अगर मैं मूल परियोजना को बदलता हूं, तो यह सब ठीक काम करता है। अगर मैं एक ही मूल परियोजना का उपयोग करता हूं तो मुझे मिलता है:

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 की जरूरत है। I सोचें समस्या इस तथ्य के कारण है कि कार्य एक मूल परियोजना का संदर्भ देता है, जो बदले में बाल कार्यों का संदर्भ देता है। मुझे इस कठिन के बारे में पूरी तरह से यकीन नहीं है।

हालांकि, यह समाधान मेरे लिए थोड़ा हैकी लगता है और मुझे बेहतर समाधान देखना अच्छा लगेगा।

उत्तर

14

कहीं आप कुछ इस तरह अर्थ JSON करने के लिए एक वस्तु कन्वर्ट करने के लिए कोशिश कर रहे हैं, और कहा कि उस में एक परिपत्र संदर्भ है,:

var myObj = new Object(); 
myObject.reference = myObj; 

अब JSON में बदलने के लिए असफल हो जायेगी की कोशिश कर रहा है, और अपने त्रुटि उत्पन्न ।

task.parent -> {project} 

project.tasks -> [{task1},{task2},...] 

इस संबंध मॉडल करने के लिए "परियोजना कई कार्य है" और "काम के लिए एक परियोजना के अंतर्गत आता है" माना जाता है:

अपने संपादित पोस्ट को देखते हुए, अपने डेटा संरचना कुछ इस तरह है।

अब सर्कुलर संदर्भ के कारण यह स्पष्ट रूप से जेसन प्रारूप में परिवर्तित नहीं किया जा सकता है।

डेटा संरचना के लिए, क्यों नहीं साथ:

project = { "id": 42, 
      "tasks": [123, 124, 127, ... ], 
      } 

task = { "id": 123, 
     "idproject": 42, 
      ... 
     } 

जब भी आप अपने AngularJS अनुप्रयोग में संबंधों को दिखाने के लिए है, तो आप फ़िल्टर के साथ जा सकते हैं। यदि आप एक परियोजना से संबंधित दिखाना चाहते हैं, तो सभी कार्यों को प्रोजेक्ट द्वारा फ़िल्टर करें।

या फ्लाई पर अपने बैकएंड से केवल आवश्यक डेटा पुनर्प्राप्त करें, यह अनुरोध करके कि बैकएंड किसी विशिष्ट प्रोजेक्ट आईडी के लिए क्या कार्य करता है।

यह करने का एक तरीका है। बेशक, बैकएंड को उचित अपडेट अनुरोध स्वीकार करने के साथ ही काम भी करेगा, उदाहरण के लिए किसी प्रोजेक्ट को अपडेट करने के लिए प्रोजेक्ट आईडी और टास्क आईडी की एक सरणी की आवश्यकता होगी।

+0

hmmm। खैर मैं अपने कोड में JSON.stringify का उपयोग नहीं कर रहा हूँ। ऐसा लगता है कि 'ConcernService.update' विधि पर असफल रहा है। –

+0

दिलचस्प बात यह है कि जब मैं चुनिंदा क्षेत्र में प्रोजेक्ट बदलता हूं तो यह सब काम करता है। तो मुझे पता है कि 'new_task.project' पर एक परिपत्र संदर्भ है लेकिन मुझे यकीन है कि यह कहां है। –

+0

यदि आपके पास क्रोम ब्राउज़र है, तो आप जावास्क्रिप्ट को डीबग करने के लिए डेवलपर टूल का उपयोग कर सकते हैं, मोज़िला में फायरबग एडन के साथ समान कार्य।आप चलते समय अपने कोड में ऑब्जेक्ट का निरीक्षण कर सकते हैं, और समस्या के मामले में काम करने वाले मामले की तुलना कर सकते हैं। – bgse

संबंधित मुद्दे