Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Model view controller 在Meteor中,我在哪里建模我的业务规则?_Model View Controller_Mvvm_Meteor - Fatal编程技术网

Model view controller 在Meteor中,我在哪里建模我的业务规则?

Model view controller 在Meteor中,我在哪里建模我的业务规则?,model-view-controller,mvvm,meteor,Model View Controller,Mvvm,Meteor,初学者问题:我已经完成了教程。我的HTML文档中有字段,由引用集合的helper函数支持,当数据库中的数据更改时,这些字段将更新 通过“隐藏完成”复选框,我还看到了数据绑定到会话变量。复选框的状态由事件处理程序存储在会话对象中,当此值更改时,列表视图将由其助手“自动”更新。在单页应用程序中分配给会话对象似乎有点奇怪 在所有这些过程中,我的js在全局范围内没有赋值,我没有创建任何对象,我只看到管道代码,从一个点到另一个点获取值。小条件逻辑被喷洒到任何需要它的地方 问题是。。。现在,我想用javas

初学者问题:我已经完成了教程。我的HTML文档中有字段,由引用集合的helper函数支持,当数据库中的数据更改时,这些字段将更新

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

在所有这些过程中,我的js在全局范围内没有赋值,我没有创建任何对象,我只看到管道代码,从一个点到另一个点获取值。小条件逻辑被喷洒到任何需要它的地方

问题是。。。现在,我想用javascript构建一个业务数据模型,对业务规则建模,然后将html字段绑定到此模型。例如,我想对一个用户建模,给它一个isVeryBusy属性,如果noTasks>5,则给它一个设置isVeryBusy=true的规则。我希望将属性和规则隔离在一个“纯”业务对象中,远离helpers、events和meteor用户对象。我希望这些业务对象在任何地方都可用,因此我可以设置一个限制,例如,不将任务分配给服务器上非常繁忙的用户。如果用户是verybusy,我可能还希望显示规则只显示其他人任务的前100个字符。哪里是创建此用户对象的正确位置,如何从HTML绑定到它?

您可以(也可能应该)使用任何允许将架构附加到模型的包。 看看:

通过使用架构,可以定义基于其他字段计算的字段,请参见autoValue属性:

然后你可以这样做:

// Schema definition of User
{
  ...,
  isVeryBusy: {
    type: Boolean,
    autoValue: function() {
      return this.tasks.length > 5;
    }
  },
  ...
}
// 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});
  }
});
对于你所有的基本问题,我强烈建议你阅读《发现流星》一书()。你可以在1-2天内阅读它,它将以一种真正可以理解的方式解释所有这些基本问题


致以最诚挚的问候,

有一个非常好的软件包来实现您正在寻找的解决方案。它是由David Burles创建的,名为“流星收集助手”。这里是:

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

// Schema definition of User
{
  ...,
  isVeryBusy: {
    type: Boolean,
    autoValue: function() {
      return this.tasks.length > 5;
    }
  },
  ...
}
// 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});
  }
});
您可以看到,在助手中,上下文是使用您提供的所有方法转换的文档。由于集合通常对客户端和服务器都可用,因此您可以在任何地方访问此功能


我希望这会有所帮助。

实际上,
Session
是一个全局反应式词典。您的问题非常广泛,好的答案将非常长(解释如何向用户对象添加字段,如何发布它们,查看/编辑它们,在方法调用中对它们作出反应,通过这些方法限制用户容量,…)。请将你的问题缩小到一个单一的、明确的、可识别的问题。例如,您问题中的第一个问题是“如何向用户的配置文件更新添加约束?”对于“非常繁忙”约束。您还可以询问如何通过聚合自动发布“isVeryBusy”字段。这里有一些关于这一切的链接:。当你有很多问题时,最好是自己动手做,或者至少一次问一两个问题。哦,还有一种文字墙。水平线和空格有助于解决这个问题。对不起,我让我自己去了一点。我已经尖锐化了这个问题,现在我来看看链接的信息。我很惊讶地得知,我可能需要一个插件manuel:viewmodel来绑定变量?请看下面的转换选项。您可以使用它向用户对象添加函数。