1

对于 js,我是个菜鸟,今天我遇到了一些我不太了解的 js,但我很想了解。你能解释一下吗?涉及剑道,但问题是纯js。

我有一个嵌套网格,例如。每行都可以扩展到其他网格,并且每个网格都有自己的数据源。当用户单击时,我通过下面的方法一一填充数据源,当它从创建调用接收到异步响应时,我遇到了强制数据源读取的问题。(调用 read 是非常不正确的事情,但是 Kendo 有自己的错误 - 这里不是重点。)。我的问题是,我没有调用 read() 的实例,该方法仅返回数据源并将其分配给网格,当事件返回时,我找不到任何可以得到正确的引用数据源实例来自。这是这里不同的上下文。

为了解决这个问题,我在构建数据源的方法中添加了一个数据源变量,然后我返回变量而不是数据源,这是同一回事。然而,这有助于有一些东西可以调用有问题的 read() 。现在在我的创建处理程序中,我在初始化期间在方法中返回的变量上调用 create。好吧,它可以工作,但我不确定每个数据源是否在 innit 之后都在其自己的实例上调用 read ?

function _getDatasource() {
        var datasource = new kendo.data.DataSource({
            transport: {
                read: {
                    url: serviceBaseUrl + "ReadQuestionnaire",
                    dataType: "json",
                    type: "POST",
                    contentType: "application/json; charset=utf-8",

                },               
               create: {
                    url: serviceBaseUrl + "CreateQuestionnaire",
                    dataType: "json",
                    type: "POST",
                    contentType: "application/json; charset=utf-8",
                    complete: function (jqXhr, textStatus) {
                        if (CheckForExceptions(jqXhr, textStatus) == false) {
                            // this is the variable I am not sure about 
                            // after innit does this always refers to this same datasource ?
                            datasource.read(); 
                        }
                    }
                }
            }
        });
        return datasource;
}
4

1 回答 1

3

您的解决方案是正确的,是的,datasource.read()在每种情况下调用都是正确的数据源对象。

这就是它起作用的原因:闭包。

闭包是在一个函数中声明的变量可以从嵌套函数访问的能力。或者,要获得更准确的描述,请参阅维基百科页面:http://en.wikipedia.org/wiki/Closure_(computer_science)

这是一个非常简单的例子:


function doStuff(){
  var name = "Derick";

  function sayMyName(){
    console.log(name);
  }

  sayMyName();
}

doStuff();

在这个例子中,我在函数name内部声明了一个变量。doStuff然后我在第一个函数中嵌套了另一个函数。该sayMyName函数name通过使用闭包来访问变量。

当我调用doStuff()时,变量被定义并分配给一个值。然后sayMyName定义函数并使用该变量。然后我打电话sayMyName()并将名称记录到控制台。

同样,在您的代码中,您正在创建一个分配给DataSource. 稍后,您将为complete回调定义一个函数。加载数据源并complete触发回调后,您将访问dataSource通过使用围绕该变量的闭包分配给 DataSource 实例的同一变量。

由于您var dataSource每次调用时都在声明_getDataSource,因此您正在创建一个新的变量/引用,并分配给一个新的 DataSource 实例。我不认为你需要return datasource在你的函数的底部,虽然......至少,complete回调函数不需要工作。也许你需要它来做其他事情,在这个功能之外,虽然?

有关 JavaScript 中的闭包的更多信息:

https://developer.mozilla.org/en-US/docs/JavaScript/Guide/Closures

JavaScript 闭包是如何工作的?

http://www.javascriptkit.com/javatutors/closures.shtml

http://www.watchmecode.net/javascript-scope(付费截屏)

高温高压

于 2013-01-29T16:23:22.317 回答