2016-05-06 15 views
0

イベントハンドラ内にネストされた関数があります。外部関数は、Treesコレクションからドキュメントのコピーを作成します。その後、内部関数は、元のツリー文書のtreeBranchesフィールドに配列に含まれるIDを持つBranchesコレクションの文書のコピーを作成します。外部関数から内部関数に返されたIDを渡す

外部関数から内部関数にnewTreeIdを渡す必要があるため、新しい分岐IDを新しい文書の配列に追加できます。内部関数のconsole.log(newTreeID)は、現在、undefinedを返しています。

Template.Actions.events({ 
    'change .action-selection': function(e) { 
     e.preventDefault(); 
     var selection = $(e.target).val(); 
     var currentTreeId = this._id; 
     var branches = Branches.find({_id:{$in:this.treeBranches}}); 

     switch(selection) { 
      case "repeat": 
       return Meteor.call('treeRepeat', currentTreeId, function (newTreeId) { 
        branches.forEach(function(b) { 
         var currentBranchId = b._id; 
         console.log(newTreeId); 
         Meteor.call('treeBranchesRepeat', currentBranchId, newTreeId, function() { 
         }); 
        }); 
       }); 
       break; 
       ... 

Meteor.methods({ 
    treeRepeat: function(currentTreeId) { 
     check(currentTreeId, String); 

     var tree = Trees.findOne({_id:currentTreeId}, {fields:{_id:0, treeBranches:0}}); 
     var newTreeId = Trees.insert(tree); 

     return { 
      _id: newTreeId 
     }; 
    }, 
    treeBranchesRepeat: function(currentBranchId, newTreeId) { 
     check(currentBranchId, String); 
     check(newTreeId, String); 

     var branch = Branches.findOne({_id:currentBranchId}, {fields: {_id: 0}}); 
     var newBranchId = Branches.insert(branch); 
     Trees.update({_id:newTreeId},{$push:{treeBranches:newBranchId}}); 

     return { 
      _id: newBranchId 
     }; 
    } 
}); 

答えて

0

これは、ツリーのすべての複製を実行して、サーバーへの1回の要求ですべてを分岐することで単純化できると思います。次のワークフロー(テストしていませんが、私はあなたのアイデアを得ると思います)を示唆している:

Template.Actions.events({ 
    'change .action-selection': function(e) { 
     e.preventDefault(); 
     var selection = $(e.target).val(); 
     var currentTreeId = this._id; 
     var currentTreebranches = this.treeBranches; 

     switch(selection) { 
      case "repeat": 
       return Meteor.call('treeAllRepeat', currentTreeId, currentTreebranches, function (err, res) { 
        if (err) { console.log(err); } 

        console.log(res); // Your new tree _id 
       }); 
       break; 
       ... 

Meteor.methods({ 
    treeAllRepeat: function(currentTreeId, branchIds) { 
     check(currentTreeId, String); 
     check(branchIds, [String]); 

     var tree = Trees.findOne({ _id: currentTreeId }, { fields: { _id: 0, treeBranches: 0 } }); 

     if (!tree) { 
      throw new Error('Tree with id ' + currentTreeId + ' not found'); 
     } 

     var newTreeId = Trees.insert(tree); 
     var branches = Branches.find({ _id: { $in: branchIds || [] } }); 

     branches.forEach(function (branch) { 
      var newBranch = Branches.findOne({ _id: branch._id }, { fields: { _id: 0 } }); 
      var newBranchId = Branches.insert(newBranch); 
      Trees.update({ _id: newTreeId }, { $push: { treeBranches: newBranchId } }); 
     }); 

     return { 
      _id: newTreeId 
     }; 
    } 
}); 

を私はthis.treeBranchesは枝のIDSであると仮定?そうでない場合は、

var currentTreebranches = _.pluck(this.treeBranches, '_id'); 

PSのようにします。 autopublishパッケージを削除した場合は、新しいツリーを購読してください。

+0

Bjorn、ありがとう!これは素晴らしいです。私の経験がないと、しばしば私は事を複雑にする。 – Bren

+0

流星とあなたの旅で幸運:) –

関連する問題