【问题标题】:Kendo data source after page load页面加载后的剑道数据源
【发布时间】:2013-09-24 08:37:44
【问题描述】:

我有一个剑道数据源,它在 document.ready() 上加载并使用 JSON 请求的结果填充组合框。然后,一旦用户在组合框中选择了一个项目,我告诉有一个函数 customerSelected() 执行以加载该客户的值。我遇到的问题是我无法在页面加载后设置另一个 Kendo 数据源来填充数据。如果我使用常规的 Jquery ajax 调用,则数据似乎会在 Kendo 模板执行后加载,并且不会填充我的数据。

function customerSelected(customerid) {
    var customer = customerid;

    var commTemplate = kendo.template(' # for (var i=0; i < data.length; i++) { # <div class="communication" contentEditable>#= data[i].fname # - #= data[i].lname # #= data[i].details #</div> # } # ');
    var commData = new kendo.data.DataSource({
        transport: {
            read: {
                url: "index.php?mode=showCustomerData",
                dataType: "json"
            }
        }
    });

    $("#communications").html(commTemplate(commData));
}

$('document').ready(function() {

    var customers = new kendo.data.DataSource({
        transport: {
            read: {
                url: "index.php?mode=showCustomers",
                dataType: "json"
            }
        }
    });
    $("#customerBox").kendoComboBox({
        dataSource: customers,
        dataTextField: "name",
        dataValueField: "customer_id",
        filter: "contains",
        change: function(e) {
            console.log(this.value());
            customerSelected(this.value());
            $("#customerSelected").val(this.value());

        }
    });


});

这里的每个数据源都返回正确的 JSON 数据,这些数据我已经用一个 REST 客户端进行了验证。问题只是 customerSelected() 函数中的 kendo.data.DataSource() 实际上并没有做任何事情。我已经尝试了多种方法来获得我在纯粹的 Jquery 世界中习惯于执行 Ajax 调用和附加/更新 DOM 的功能。在加载 DOM 后,我在这里缺少什么以允许另一个数据源?

【问题讨论】:

    标签: javascript jquery kendo-ui


    【解决方案1】:

    你的问题是:

    1. 创建数据源后没有读取数据。

    2. 数据是异步加载的,不能马上使用。

    试试这个:

    function customerSelected(customerid) {
        var customer = customerid;
    
        var commTemplate = kendo.template(' # for (var i=0; i < data.length; i++) { # <div class="communication" contentEditable>#= data[i].fname # - #= data[i].lname # #= data[i].details #</div> # } # ');
        var commData = new kendo.data.DataSource({
            transport: {
                read: {
                    url: "index.php?mode=showCustomerData",
                    dataType: "json"
                }
            }
        });
    
        // run this callback the next time data changes
        // which will be when the data is done being read from the server
        commData.one("change", function () {
            $("#communications").html(commTemplate(commData.data()));
        });
    
        // read the data from the server
        commData.fetch();
    }
    

    【讨论】:

      【解决方案2】:

      尝试:

      var commTemplate = kendo.template(' # for (var i=0; i < data.length; i++) { # <div class="communication" contentEditable>#= data[i].fname # - #= data[i].lname # #= data[i].details #</div> # } # ');
      var commData = new kendo.data.DataSource({
      transport: {
          read: {
              url: "index.php?mode=showCustomerData",
              dataType: "json"
          }
      },
      change: function() {
          $("#communications").html(kendo.render(commTemplate, this.view());
      }
      });
      
      commData.read();
      

      取自:http://demos.kendoui.com/web/datasource/remote-data.html

      【讨论】:

      • 这很有帮助,但不会填充数据。我看到 DataSource 现在实际上向服务器发出了请求,chrome 网络开发人员选项卡显示了结果: [{"id":"1","fname":"Keizer","lname":"Von","details" :"THESE ARE SOME DETAILS"}] 但数据不会在页面上进行迭代。当我尝试使用 jquery 时,我能够让模板引擎进行数据迭代,但数据字段没有正确分配
      • 也许我需要定义架构? console.log() 报告 {"options":{"data":[],"schema":{},"serverSorting":false,"serverPaging":false,"serverFiltering":false,"serverGrouping":false, "serverAggregates":false,"batch":false,"transport":{"read":{"url":"index.php?mode=showCustomerData","dataType":"json"}}},"_map" :{},"_prefetch":{},"_data":[],"_pristineData":[],"_ranges":[],"_view":[],"_pristine":[],"_destroyed": [],"_group":[],"_events":{"sync":[null]},"transport":{"options":{"read":{"url":"index.php?mode= showCustomerData","dataType":"json"}},"cache":{}},"reader":{},"_requestInProgress":true}
      • 进一步修改我能够在更改中使用它来获取数据进行迭代:function() { $("#communications").html(commTemplate(this._pristine)); }
      【解决方案3】:

      $("#communications").html(commTemplate(this._pristine));

      【讨论】:

      • 添加解释为什么这可以解决问题将有助于 OP 学习。
      • 这更像是一种 hack,而不是遵守 Kendo 的惯例。它起作用的唯一原因是因为我在内部转储了 DataSource 的输出并发现 this._pristine 具有我期望的结果数据。它应该比这更直接。 DataSource.data 对象没有被填充,但 DataSource._pristine 是,在搜索谷歌时我找不到任何与 _pristine 相关的东西
      • 查看您的原始代码,在我看来,问题在于您在定义 DataSource 之后尝试填充数据,但不能保证已经收到数据。尝试在您的服务(index.php)中添加延迟,看看它是否仍然运行......我会说,除非您在等待接收数据的回调中运行此代码,否则它将失败。除非您想依赖 KendoUI 内部结构并暴露于实现中的未来变化:您不应该使用 _pristine 而是使用 data() 方法。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-18
      • 1970-01-01
      相关资源
      最近更新 更多