Reputation: 17
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
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
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