BlueNut
BlueNut

Reputation: 17

How to get an array from an array in Meteor.js

everyone. I would like the students who enroll a subject are shown in a table when this subject is selected in a dropdown list. The ID of these students is stored in an array. The problem is that this ID array retrieved from the document looks kind of strange. seem like there is an array in an array. Like this shown in the console: shown in console

 {enrollment: Array(2)}
     enrollment: Array(2)
     0: "b1602231"   
     1: "B1560124"   
     length: 2 
     __proto__: Array(0)
     __proto__: Object

And it throwed an error: Exception in template helper: Error: $in needs an array

So how could I solve this? I would really appreciate it if someone can give me some idea.

Below is the event handler and helper.

Template.subject.events({
  ‘change #dropdown’: function(event, template) {
    var selectedValue = $(event.target).val();
    var array = subject.findOne( { subjectCode:selectedValue }, { fields:{ _id:0, enrollment:1 } } );
    Session.set(‘studentEnrolled’,array);
  }
});

Template.student.helpers({
  student: function() {
    var listOfStudent = Session.get( ‘studentEnrolled’ );
    return student.find( { studentID: { $in:listOfStudent } } );
  }
});

//HTML

<template name="student">
        {{#each student}}
        <tr>
          <td>{{name}}</td>
        </tr>
        {{/each}}
</template>

Upvotes: 1

Views: 333

Answers (2)

coagmano
coagmano

Reputation: 5671

Copying my answer from the forums:

First of all, you are taking the whole subject document (and after the first answer, wrapping that array into another array) here:

Session.set('studentEnrolled',[array]);

Which means when you search here:

return student.find({studentID:{$in:listOfStudent}});

You are passing an array with a document in it, instead of the enrollments array.

What you want to do is store the enrollments in the session:

Session.set('studentEnrolled', array.enrollments);

I'd also recommend renaming the variable array since it's not an array, and that probably contributed to your confusion

Upvotes: 1

xdeepakv
xdeepakv

Reputation: 8135

Find get one records from data. u can convert in array using [data]

var array = subject.findOne({subjectCode:selectedValue}, {fields:{_id:0, enrollment:1}});
Session.set(‘studentEnrolled’,[array]);
}

// For async update More: https://blog.meteor.com/using-promises-and-async-await-in-meteor-8f6f4a04f998

Template.hello.onCreated(function helloOnCreated() {
  this.list = new ReactiveVar([]);
  Meteor.call('getHobbits', (error, result) => {
    this.list.set(result);
  });
});

Template.hello.helpers({
  hobbits() {
    return Template.instance().list.get();
  },
});

Upvotes: 1

Related Questions