【问题标题】:Meteor - Where to put calculating methods properlyMeteor - 正确放置计算方法的位置
【发布时间】:2015-12-01 08:39:57
【问题描述】:

我从 1-2 周开始阅读和观看有关 Meteor 的教程。我已经了解了如何构建有关服务器和客户端代码、帐户、安全性等的流星应用程序。 我想不通的是: 我在哪里正确放置计算逻辑?

例如: 用户将数据放入表单中,数据保存在数据库中。根据这个输入数据,我想通过将数据通过让我们说大约 20 个方法的链接来进行几次计算,最后显示一些结果。

目前,我在 Template.displayResults.helper 所在的文件中拥有所有这些方法。 当我将它们放在另一个文件中时,它们不会被识别,我认为是因为 Meteor 放置了包装器。


示例:我有一组 DIY 项目,每个项目都有一个字段,其中包含项目所需的一系列实用程序。

Projects = new Mongo.Collection('projects');

   /* 
   exampleProject = { 
        "name": "Kitchen table",
        "utilities": ["Hammer", "Glue"]
   }
   */

我想根据用户检查的实用程序显示所有可能的 DIY 项目。

用户界面有一组复选框,用户可以选择一堆他想使用的实用程序。 这些值保存在一个集合中。

Utilities = new Mongo.Collection('utilities');

    /* 
    exampleUtility = {
        "name": "Hammer",
        "checked": true
    }
    */

然后我想计算可能的项目...

Template.displayResults.helpers({

projectsPossible: function () {
        var utilitiesCheckedDB = Utilities.find({
            checked: true
        }).fetch();
        var projectsAll = Projects.find().fetch();
        return projectsPossible(utilitiesCheckedDB, projectsAll);
    }
});

// Returns an array of all possible projects depending on the selected utilities
function projectsPossible(utilitiesCheckedDB, projectsAll) {
    var result = [];
    _.each(projectsAll, function (project) {
        if (project.utilities.length === _.intersection(project.utilities, checkedCheckboxesList(utilitiesCheckedDB)).length) {
        result.push(project);
    }
});
return result;
}

// Returns an array of all checked utilities in the current checkbox database
function checkedCheckboxesList(checkedCheckboxesDB) {
    var result = [];
    _.each(checkedCheckboxesDB, function (checkbox) {
        result.push(checkbox.name);
    });
    return result;
}

问题是:还有更多方法,例如“projectsPossible”和“checkedCheckboxesList”。我应该将这些方法放在哪里以获得良好的结构?

提前致谢! 输入电压

【问题讨论】:

  • 您能否提供一个重现问题的minimal example(或至少在您的问题中添加代码)?

标签: javascript html meteor


【解决方案1】:

如果要注册全局助手,只需使用Template.registerHelper(name, function),例如:

Template.registerHelper('projectsPossible', function() {
    var utilitiesCheckedDB = Utilities.find({
        checked: true
    }).fetch();
    var projectsAll = Projects.find().fetch();
    return projectsPossible(utilitiesCheckedDB, projectsAll);
});

如果您想让函数projectsPossible(utilitiesCheckedDB, projectsAll)checkedCheckboxesList(checkedCheckboxesDB) 可从其他(客户端)文件访问,您可以将它们设为全局。例如:

projectsPossible = function(utilitiesCheckedDB, projectsAll) {
    var result = [];
    _.each(projectsAll, function(project) {
        if (project.utilities.length === _.intersection(project.utilities, checkedCheckboxesList(utilitiesCheckedDB)).length) {
            result.push(project);
        }
    });
    return result;
};

【讨论】:

    【解决方案2】:

    您可以使用集合的transform 选项创建模型类。有关 ES5 示例,请参阅文档:http://docs.meteor.com/#/full/mongo_collection

    此外,您必须通过不使用 var 来使该模型类或函数全局化。

    (function() {
      foo = function foo() {
        alert("fooh") 
      }
    })()
    

    在上面的示例中,如果没有foo =foo 函数将仅在其自己的文件中可见,因为有包装器。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-09-05
      • 2021-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多