在JayData中:如何将变量传递给筛选器,只有全局变量有效。

3

我有这个函数:

function db_borrarServer(idABorrar){
    serversDB.servidores
        .filter(function(elementoEncontrado) {
            return elementoEncontrado.id_local == this.idABorrar; 
        })
        .forEach(function(elementoEncontrado){
                console.log('Starting to remove ' + elementoEncontrado.nombre);
                serversDB.servidores.remove(elementoEncontrado);
                serversDB.saveChanges();
        });    
}

如果我用数字替换变量"this.idABorrar",它就可以工作,但现在它不起作用。

return elementoEncontrado.id_local == 3; 

如果我将idABorrar声明为全局变量,也可以工作。

我需要将idABorrar作为变量传递。我该怎么做?

3个回答

2
实体集的filter()函数(像任何其他谓词函数一样)不是真正的闭包块,而是作为函数编写的表达式树。要解析此范围内的变量,您只能依赖全局和代表参数上下文的“this”。这遵循HTML5 Array.filter语法。要访问闭包变量,您需要通过参数传递它们。以下是一些示例:
在事件处理程序中,最长的语法为:
$('#myelement').click(function() {
   var element = this;
   context.set.filter(function(it) { return it.id_local == this.id; }, 
                      { id: element.id});
});

从 JayData 1.2 开始,您可以省略 this 来引用参数,并使用字符串谓词。

$('#myelement').click(function() {
   var element = this;
   context.set.filter("it.id_local == id", { id: element.id});
});

请注意,在字符串语法中,使用 it 表示 lambda 参数是必须的。
在 JayData 1.3 中,我们将拥有更简单的调用语法。
$('#myelement').click(function() {
   var element = this;
   context.set.filter("it.id_local", "==", element.id);
});

如果您在像这样的筛选器上遇到了“it.Id == this.Id没有'apply'方法”的错误,例如var predicate = "it.Id == this.Id"; db.Table.filter(predicate, {Id: 1}),该怎么办? - DontVoteMeDown

1
在过滤器中,您应该传递一个对象作为this对象,像这样:
.filter(function(){},{idABorrar: foo})

foo 可以是 const 或任何在作用域内的变量。


0

.filter() 函数接受一个可选的第二个参数,该参数被分配给第一个参数函数内部的 this

因此,您可以像这样修改您的代码:

function db_borrarServer(idABorrar){
    serversDB.servidores
        .filter(function(elementoEncontrado) {
            return elementoEncontrado.id_local == this; 
        }, idABorrar)
        .forEach(function(elementoEncontrado){
                console.log('Starting to remove ' + elementoEncontrado.nombre);
                serversDB.servidores.remove(elementoEncontrado);
                serversDB.saveChanges();
        });
}

请告诉我你的进展情况 - 我对jaydata也很陌生,一直在努力理解这个范式。 但是我遇到了与你相同的问题,这是我为自己解决它的方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接