无法基于 parse.com 查询创建 Meteor.js 助手
Can't create Meteor.js helper based on parse.com query
我的 meteor 应用程序访问 Parse.com 以提取和显示数据。
我开始将 parse.com javascript 查询直接集成到模板的渲染函数中,效果很好。
现在,我想在助手中使用 Parse.com 查询将其传递给位于我模板中的流星 {{#each}} 循环。
Template.dashboard.helpers({
app: function () {
//init new array
var appsArr = [];
//Create a Parse Query for Post objects
var query = new Parse.Query("Apps");
query.descending("createdAt");
var appsObj = {};
query.find({
success: function(results) {
// Add the returned Parse.Object values to appsArr
for (var i = 0; i < results.length; i++) {
appsObj = {};
appsObj.obid = results[i].id;
appsObj.title = results[i].attributes.title;
appsObj.screenshot1 = results[i].attributes.screenshot1._url;
appsObj.appIcon = results[i].attributes.appIcon._url;
appsArr.push(appsObj);
}
},
error: function(error) {
alert("Error: " + error.code + " " + error.message);
}
});
return appsArr
}
});
每次我在助手中尝试 return 我的数组 (appsArr) 时,我都会收到错误消息:
"Exception in template helper: undefined"。我也无法让我的解析对象在控制台中输出。同样,相同的代码在呈现的函数中起作用。
我对 Meteor.js 和 Blaze 模板还很陌生。请帮助我正确地将这个解析查询实现到助手中,这样我就可以在模板中{{#each}}。
{{#each app}}
<h3 class="app-title">{{title}}</h3>
{{/each}}
提前致谢!
因为 query.find
函数是异步和非阻塞的,你不能只在回调中分配变量并 return 它们在回调之外 - 回调没有 运行 当你点击 return
语句时,所以你正在 returning 一些尚未定义的东西。
解决这个问题的一个简单方法是使用反应变量(一个变量的赋值被监视);您可以使用 [ReactiveVar][1]
或内置的反应式 [Session][2]
变量。我通常使用 Session
。一个可能的实现是这样的(很抱歉没有提前测试):
Template.dashboard.onRendered({ // onRendered, calculate appVar
Session.set('appsVar', null); // reset appsVar immediately -- can also do this in onCreated / onDestroyed to clean up
//init new array
var appsArr = [];
//Create a Parse Query for Post objects
var query = new Parse.Query("Apps");
query.descending("createdAt");
var appsObj = {};
query.find({
success: function(results) {
// Add the returned Parse.Object values to appsArr
for (var i = 0; i < results.length; i++) {
appsObj = {};
appsObj.obid = results[i].id;
appsObj.title = results[i].attributes.title;
appsObj.screenshot1 = results[i].attributes.screenshot1._url;
appsObj.appIcon = results[i].attributes.appIcon._url;
appsArr.push(appsObj);
}
Session.set('appsVar', appsVar);
},
error: function(error) {
alert("Error: " + error.code + " " + error.message);
}
});
}
});
Template.dashboard.helpers({
app: function() { return Session.get('appsVar'); } // This will re-run when Session.appsVar is updated in the callback above.
});
我的 meteor 应用程序访问 Parse.com 以提取和显示数据。 我开始将 parse.com javascript 查询直接集成到模板的渲染函数中,效果很好。
现在,我想在助手中使用 Parse.com 查询将其传递给位于我模板中的流星 {{#each}} 循环。
Template.dashboard.helpers({
app: function () {
//init new array
var appsArr = [];
//Create a Parse Query for Post objects
var query = new Parse.Query("Apps");
query.descending("createdAt");
var appsObj = {};
query.find({
success: function(results) {
// Add the returned Parse.Object values to appsArr
for (var i = 0; i < results.length; i++) {
appsObj = {};
appsObj.obid = results[i].id;
appsObj.title = results[i].attributes.title;
appsObj.screenshot1 = results[i].attributes.screenshot1._url;
appsObj.appIcon = results[i].attributes.appIcon._url;
appsArr.push(appsObj);
}
},
error: function(error) {
alert("Error: " + error.code + " " + error.message);
}
});
return appsArr
}
});
每次我在助手中尝试 return 我的数组 (appsArr) 时,我都会收到错误消息: "Exception in template helper: undefined"。我也无法让我的解析对象在控制台中输出。同样,相同的代码在呈现的函数中起作用。
我对 Meteor.js 和 Blaze 模板还很陌生。请帮助我正确地将这个解析查询实现到助手中,这样我就可以在模板中{{#each}}。
{{#each app}}
<h3 class="app-title">{{title}}</h3>
{{/each}}
提前致谢!
因为 query.find
函数是异步和非阻塞的,你不能只在回调中分配变量并 return 它们在回调之外 - 回调没有 运行 当你点击 return
语句时,所以你正在 returning 一些尚未定义的东西。
解决这个问题的一个简单方法是使用反应变量(一个变量的赋值被监视);您可以使用 [ReactiveVar][1]
或内置的反应式 [Session][2]
变量。我通常使用 Session
。一个可能的实现是这样的(很抱歉没有提前测试):
Template.dashboard.onRendered({ // onRendered, calculate appVar
Session.set('appsVar', null); // reset appsVar immediately -- can also do this in onCreated / onDestroyed to clean up
//init new array
var appsArr = [];
//Create a Parse Query for Post objects
var query = new Parse.Query("Apps");
query.descending("createdAt");
var appsObj = {};
query.find({
success: function(results) {
// Add the returned Parse.Object values to appsArr
for (var i = 0; i < results.length; i++) {
appsObj = {};
appsObj.obid = results[i].id;
appsObj.title = results[i].attributes.title;
appsObj.screenshot1 = results[i].attributes.screenshot1._url;
appsObj.appIcon = results[i].attributes.appIcon._url;
appsArr.push(appsObj);
}
Session.set('appsVar', appsVar);
},
error: function(error) {
alert("Error: " + error.code + " " + error.message);
}
});
}
});
Template.dashboard.helpers({
app: function() { return Session.get('appsVar'); } // This will re-run when Session.appsVar is updated in the callback above.
});