Loop call within template


#1

Hi there!

I have a helper that is being picked up within a template loop. What it does is it gets a specific detail from the server (db)

videoCreator: -> Meteor.call 'getVideoCreator', id, (error, result) -> Session.set 'video', result Session.get (result)
(can’t figure out how to indent) But basically what it does is it tries to get the result from the database. However, this is being run on a template loop. And looks messy – it’s acting weird.

Any idea how to run a Meteor.call from client within the template loop?


#2

Three ` before and after code

Didn’t you just say this was messy? :wink: How about running it in the onCreated function?

Template.myTemplate.onCreated(function () {
    // Just guessing
    var id = Blaze.getData().id;
   
    Meteor.call( 'getVideoCreator', id, (error, result) => {
         Session.set( 'videoCreator', result);
    });
});

Template.myTemplate.helpers({
     videoCreator() {
        return Session.get("videoCreator")
    }
});

Now you will only get it once.


#3

It’s not a good idea to get and set the same reactive variable inside a helper (or any reactive context).

Better is to make the call and the set in the onCreated callback and reserve the get for the helper.


#4

Thanks guys!

But remember, I’m also having this:

{{#each video}}
<p>Name: {{videoCreator}}</p>
{{/each}}

How can the Meteor.call be triggered while on the loop?

PS. I saw in one StackOverflow answer about the use of reactiveVar. Is that needed here?


#5

Ah, so it is in a list. Then you would do something similar.

Template.videoItem.onCreated(function () {
    var self = this;
    self.creator = new ReactiveVar("");

    var id = Blaze.getData().id;
   
    Meteor.call( 'getVideoCreator', id, (error, result) => {
         self.creator.set(result);
    });
});

Template.videoItem.helpers({
     videoCreator() {
        return Template.instance().creator.get()
    }
});

And then do this

{{#each video}}
   {{> videoItem}}
{{/each}}
<template name="videoItem">
   <p>Name: {{videoCreator}}</p>
</template>

Makes sense? Usually a good idea to use an instance specific RactiveVar rather than Session anyway.


#6

I’m getting a ReactiveVar is not defined error

My code:

Template.video_item.onCreated ->
	self = this
	self.creator = new ReactiveVar('')
	id = Blaze.getData()._id

	Meteor.call 'getVideoCreator', id, (error, result) ->
		self.creator.set result

Template.video_item.helpers
	videoCreator:  ->
		Template.instance().creator.get()

#7

have you added the reactive-var package?

meteor add reactive-var


#8

Opps… I didn’t know it’s a package. Thanks. Will try that.


#9

easily missed

http://docs.meteor.com/#/full/reactivevar_pkg


#10

Thanks guys. It worked! This thing has been bothering me for long. You’ve all been very helpful.