Javascript 那';这';嵌入文档中模型的变量?
我对node.js和sails有些陌生,但很简单,所以我喜欢:) 实际上,我正在使用sails框架0.10rc3和MongoDB ans sails mongo 我知道waterline的贡献者不太喜欢mongodb()模型中的嵌入式文档,但无论如何,我想知道'this'变量在模型中是如何工作的,以及如何检索内部数组中的当前元素 下面是一个模型示例(我们可以称之为ProjetSpan):Javascript 那';这';嵌入文档中模型的变量?,javascript,node.js,mongodb,sails.js,waterline,Javascript,Node.js,Mongodb,Sails.js,Waterline,我对node.js和sails有些陌生,但很简单,所以我喜欢:) 实际上,我正在使用sails框架0.10rc3和MongoDB ans sails mongo 我知道waterline的贡献者不太喜欢mongodb()模型中的嵌入式文档,但无论如何,我想知道'this'变量在模型中是如何工作的,以及如何检索内部数组中的当前元素 下面是一个模型示例(我们可以称之为ProjetSpan): module.exports={ 属性:{ 项目: { 型号:'Projet' }, 跨度: { 开始: {
module.exports={
属性:{
项目:
{
型号:'Projet'
},
跨度:
{
开始:
{
键入:“日期时间”,
要求:正确,
日期时间:对,
before:function(){
如果(本项目结束<本项目结束)
把这个还给我。结束;
其他的
返回此.proj.end;
}
},
完:
{
键入:“日期时间”,
要求:正确,
日期时间:对,
之后:函数(){
如果(this.start>this.proj.start)
返回此文件。开始;
其他的
返回this.proj.start;
}
}
}
}
};
在这种情况下,“this”将如何工作?“this”是一个跨度(因此this.end可以工作,而不是this.proj.end)还是“this”是一个项目跨度(ans so this.proj.end可以工作,但不是this.end)
最后,如何使this.end(当前范围中的变量)和this.proj.end(当前文档关联中的变量)在此嵌入式上下文中工作?Waterline完全不支持嵌入式文档,只提供
json
数据类型。因此,您的模型示例在Sails中不起作用,需要重写为:
module.exports = {
attributes: {
proj: {
model:'projet'
},
spans: {
type: 'json'
},
before: function() {
if (this.spans.end < this.proj.end) {
return this.spans.end;
} else {
return this.proj.end;
}
},
after: function() {
if (this.spans.start > this.proj.start) {
return this.spans.start;
} else {
return this.proj.start;
}
}
}
module.exports={
属性:{
项目:{
型号:'projet'
},
跨度:{
键入:“json”
},
before:function(){
if(this.span.endthis.proj.start){
返回this.span.start;
}否则{
返回this.proj.start;
}
}
}
在实例方法中(如before
和before
和before
这里),this
引用整个实例对象。您需要通过检查来增强该代码,以确保this.proj
是一个对象(即,它填充了ProjetSpan.find({}.populate('project')
),而this.span.end
和this.span.start
实际上存在(因为水线没有验证嵌入的JSON)。谢谢:)对于对象检查,我已经将this.proj!=null&&typeof this.proj==='object'
,但是span
呢?在这种状态下,它是对象、数组还是其他东西?“span”将是您设置为的任何JSON类型;很可能是一个对象或数组。不幸的是,它们都是typeof
“object”,但您可以使用sails.util.isArray()
来测试数组(sails.util
.Cool thx:)!我根据建议更改了模型,但是在某些时候,深度关联测试呢?比如if((this.projCollab!=null&&typeof this.projCollab=='object')&&(this.projCollab.proj!=null&&typeof this.projCollab.proj=='object'){if(this.end之前的函数中返回this.end;否则返回this.projCollab.proj.end;}
?我知道我们现在不能使用I,我已经为此做了一些更改,但在像这样的情况下仍然需要它。。
module.exports = {
attributes: {
proj: {
model:'projet'
},
spans: {
type: 'json'
},
before: function() {
if (this.spans.end < this.proj.end) {
return this.spans.end;
} else {
return this.proj.end;
}
},
after: function() {
if (this.spans.start > this.proj.start) {
return this.spans.start;
} else {
return this.proj.start;
}
}
}