0

我正在开发一个 Meteorjs 应用程序,我有一个教学大纲,我想复制或克隆这个教学大纲。在我的教学大纲中,有一些模块可以达到多个级别,这意味着一个模块可以有另一个模块作为其子模块等等。例如,我有一个模块语法,语法有另一个模块,名为时态和时态,还有一些其他模块,名为现在过去未来这些将看起来像这样。

tenses
    past
        simple
        negative
        interogative
    present
        simple
        negative
        interogative
    future
        simple
        negative
        interogative

数据库字段是 name、parent_id、has_children、syllabus_id 这些mudules 可以进一步包含一些子模块或子模块。在数据库中检查一个模块是否有更多的孩子我有一个布尔字段has_children并将parent_id孩子与父母联系起来。如果元素是根元素,它的“parent_id”将为空。

为此,我尝试递归地到达每个元素,但我只能在一个级别到达一个元素。意味着我没有接触到元素的兄弟姐妹,而是孩子。

我的代码是:

cloneSyllabus:function(syllabi_id){
    syll_obj=Meteor.syllabi.findOne({_id:syllabi_id});
    new_syllabi_id=Meteor.syllabi.insert({

                                        subject_id:syll_obj.subject_id,
                                        level_id:syll_obj.level_id,
                                    });
    var parent_objs = Meteor.collecton.find({
                                              parent_id:null, 
                                              syllabus_id:syllabi_id}).fetch()

    for(var i=0;i<syll_design_objs.length;i++){
        makeClone(parent[i],null,new_syllabi_id)    
    }
}

另一个递归创建对象的函数是

function makeClone(item,parent_id,syllabi_id){
    var item_id=item._id
    delete item._id
    item.parent_id=parent_id
    item.syllabus_id=syllabi_id
    var new_parent_id=Meteor.syllabi_design.insert(item)
    if(item.has_children){
        child_items=Meteor.collection.find({parent_id:item_id}).fetch();
        for(i=0;i<child_items.length;i++){
            makeClone(child_items[i],item_id,syllabi_id);
        }
    }
}

但是使用它我只能检索同一级别的一个元素,但不能检索其兄弟姐妹。我将能够通过简单的否定疑问句创建时态告诉我在检索这些对象时我在哪里犯了错误。或者告诉我任何其他方式来完成任务。在这里,我只需要更改 syllabus_id 并再次创建所有对象。

4

1 回答 1

1

您的代码中的一切都是完美的,只需在您的代码中添加递归函数终止语句。cloneSyllabus:function(syllabi_id){ syll_obj=Meteor.syllabi.findOne({_id:syllabi_id}); new_syllabi_id=流星.syllabi.insert({

                                    subject_id:syll_obj.subject_id,
                                    level_id:syll_obj.level_id,
                                });
var parent_objs = Meteor.collecton.find({
                                          parent_id:null, 
                                          syllabus_id:syllabi_id}).fetch()

for(var i=0;i<syll_design_objs.length;i++){
    makeClone(parent[i],null,new_syllabi_id)    
}
return 
}

并在函数的循环中声明变量iasvar ichild_objsas ,因为这些变量在这里被视为代码中的 glabal 变量。 var child_objsmakeClone

function makeClone(item,parent_id,syllabi_id){
    var item_id=item._id
    delete item._id
    item.parent_id=parent_id
    item.syllabus_id=syllabi_id
    var new_parent_id=Meteor.syllabi_design.insert(item)
    if(item.has_children){
        child_items=Meteor.collection.find({parent_id:item_id}).fetch();
        for(var j=0;j<child_items.length;j++){
            makeClone(child_items[i],item_id,syllabi_id);
        }
    }
    else{
        return
    }
    }     

希望这对你来说是完美的

于 2014-03-27T09:04:38.717 回答