0

我的流星应用程序访问 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
}
});

每次我尝试在帮助程序中返回我的数组(appsArr)时,我都会收到错误消息:“模板帮助程序中的异常:未定义”。我也无法让我的解析对象在控制台中输出。同样,相同的代码也适用于渲染函数。

我对 Meteor.js 和 Blaze 模板相当陌生。请帮助我正确地将此解析查询实现到帮助程序中,以便我可以在模板中{{#each}}。

 {{#each app}}
        <h3 class="app-title">{{title}}</h3>
{{/each}} 

提前致谢!

4

1 回答 1

0

因为该query.find函数是异步且非阻塞的,所以您不能只在回调中分配变量并在回调之外返回它们——在您点击return语句时回调还没有运行,所以您返回的东西是尚未定义。

解决此问题的一种简单方法是使用反应变量(监视其分配的变量);您可以使用[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.
});
于 2015-04-13T14:00:43.273 回答