在Meteor中,我在哪里建立业务规则模型?

时间:2015-06-26 08:41:51

标签: model-view-controller mvvm meteor

初学者问题:我已经完成了Try Meteor教程。我在我的HTML文档中有字段,由引用集合的辅助函数支持,以及BOOM - >数据在数据库中更改时,字段会更新。

使用“隐藏已完成”复选框,我还看到了与会话变量的数据绑定。复选框的状态由事件处理程序和BOOM存储在Session对象中 - >当此值更改时,列表视图由其帮助程序“自动”更新。在单页面应用程序中分配会话对象似乎有点奇怪。

通过这一切,我的js在全局范围内没有任何分配,我没有创建任何对象,而且我大多只看到管道代码,从一个点到另一个点获取值。小条件逻辑在任何需要的地方喷洒。

问题...现在我想在javascript中构建我的业务数据模型,建模我的业务规则,然后将html字段绑定到此模型。例如,我想为用户建模,给它一个isVeryBusy属性,如果noTasks>则设置isVeryBusy = true的规则。 5.我希望将属性和规则隔离在“纯”业务对象中,远离帮助程序,事件和流星用户对象。我希望这些业务对象随处可用,因此我可以限制,例如,不将任务分配给在服务器上强制执行的用户。我可能还希望显示规则只显示其他人员任务的前100个字符,如果用户是非常有趣的话。创建此用户对象的正确位置在哪里,以及如何从我的HTML绑定到它?

2 个答案:

答案 0 :(得分:1)

You can (and probably should) use any package which allows you to attach a Schema to your models. Have a look at: https://github.com/aldeed/meteor-collection2 https://github.com/aldeed/meteor-simple-schema

By using a schema you can define fields, which are calculated based on other fields, see the autoValue property: https://github.com/aldeed/meteor-collection2#autovalue

Then you can do something like this:

// Schema definition of User
{
  ...,
  isVeryBusy: {
    type: Boolean,
    autoValue: function() {
      return this.tasks.length > 5;
    }
  },
  ...
}

For all your basic questions, I can strongly recommend to read the DiscoverMeteor Book (https://www.discovermeteor.com/). You can read it in like 1-2 days and it will explain all those basic questions in a really comprehensible way.

Best Regards,

答案 1 :(得分:0)

有一个非常好的软件包可以实现您正在寻找的解决方案。它由David Burles创建,它被称为“meteor-collection-helper”。这是atmosphere link

您应该查看链接以查看此处提供的示例,但根据说明,您可以实现您提到的一些功能,如下所示:

// Define the collections
Clients = new Mongo.Collection('clients');
Tasks   = new Mongo.Collection('tasks');

// Define the Clients collection helpers
Clients.helpers({
  isVeryBusy: function(){
    return this.tasks.length > 5;
  }
});

// Now we can call it either on the client or on the server
if (Meteor.isClient){
  var client = Clients.findOne({_id: 123});
  if ( client.isVeryBusy() ) runSomeCode();
}

// Of course you can use them inside a Meteor Method.
Meteor.methods({
  addTaskToClient: function(id, task){
    var client = Clients.findOne({_id: id});
    if (!client.isVeryBusy()){ 
      task._client = id;
      Tasks.insert(task, function(err, _id){
        Clients.update({_id: client._id}, { $addToSet: { tasks: _id } });
      }); 
    }
  }
});

// You can also refer to other collections inside the helpers
Tasks.helpers({
  client: function(){
    return Clients.findOne({_id: this._client});
  }
});

您可以看到帮助器内部的上下文是使用您提供的所有方法转换的文档。由于集合对客户端和服务器都是可用的,因此您可以在任何地方访问此功能。

我希望这会有所帮助。