【问题标题】:How to reuse kendo ui remote binding datasource (change transport.read.data then refresh)如何重用 kendo ui 远程绑定数据源(更改 transport.read.data 然后刷新)
【发布时间】:2016-02-09 02:52:19
【问题描述】:

我想问是否可以重用远程绑定kendo.data.Datasource,而不是使用新参数创建新绑定。

我的场景是我有一个搜索框和一个列表视图。当用户进入搜索框时,会向服务器发送一个带有搜索框值参数的请求。我能够通过创建新的kendo.data.Datasource 每个keyup 事件使其正常工作,但内存成为我的一个问题。

var viewModel = kendo.observable({
  searchId: "", // searchbox value
  searchResult: null, // search result listview datasource
  searchFnc: function() { // search function
    // QUESTION: is there any way to update the current datasource object 
    // to refresh the list view instead of create new object?
    // something like: 
    // this.set("searchResult.options.transport.read.data.postId", this.get("searchId"));

    this.set("searchResult", new kendo.data.DataSource({
      transport: {
        read: {
          url: "http://jsonplaceholder.typicode.com/comments",
          dataType: "jsonp",
          data: {
            postId: this.get("searchId")
          }
        }
      }
    }));
  }
});

kendo.bind($("#myView"), viewModel);
.item {
  list-style: none;
}
.item span {
  display: inline-block;
  min-width: 40px;
}
#myListView {
  min-height: 50px;
}
<link href="https://kendo.cdn.telerik.com/2016.1.112/styles/kendo.common.min.css" rel="stylesheet" />
<link href="https://kendo.cdn.telerik.com/2016.1.112/styles/kendo.default.min.css" rel="stylesheet" />

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<script src="https://kendo.cdn.telerik.com/2016.1.112/js/kendo.all.min.js"></script>



<div id="myView">
  <label>Enter Post ID (1,2,3,4...)
    <label>
      <br/>
      <span class="k-textbox k-space-right">
    <input type="text" data-value-update="keyup" data-bind="value: searchId, events: {keyup: searchFnc}"/>
    <a href="javascript:;" class="k-icon k-i-search" data-bind="click: searchFnc">&nbsp;</a>
  </span>

      <ul id="myListView" data-role="listview" data-bind="source: searchResult" data-template="template-search-result">
      </ul>
</div>

<script type="text/x-kendo-template" id="template-search-result">
  <li class="item">
    <span>#: postId #</span>
    <span>#: id #</span>
    <span>#: name #</span>
  </li>
</script>

【问题讨论】:

    标签: javascript jquery kendo-ui kendo-datasource


    【解决方案1】:

    这个呢? change-datasource-url-on-grid。它正在使用与您的剑道相似的功能(options.transport.read.url)。然后更新为.refresh()

    【讨论】:

    • 我其实一开始也试过这个,但是没有用。也许是因为我使用的是列表视图?
    【解决方案2】:

    我会这样做fiddle

    var viewModel = kendo.observable({
        searchId: 1,
        searchResult: new kendo.data.DataSource({
            transport: {
                read: {
                    url: function() {
                        return "https://jsonplaceholder.typicode.com/" + viewModel.get("searchId") + "/comments"
                    },
                    dataType: "jsonp"
                }
             }
        }),
        searchFnc: function() {
            this.searchResult.read();
        }
    
    });
    
    kendo.bind($("#myView"), viewModel);
    

    【讨论】:

    • 我也试过这个,但this 可以通过postId: this.get("searchId") 访问。实际上它不是viewModel。我不知道我是否遗漏了什么。你能建立一个工作的sn-p吗?只需克隆我的并进行编辑。
    • 是的,你是对的。您必须将搜索 ID 直接包含在 url 中。我确实编辑了我的答案。
    • 它根本不起作用。我相信变量viewModel 尚未在url: function() { ... } 中定义,this 也未指代viewModel 本身。即使我修复了 REST url,你的小提琴也不起作用。 (正确的是http://jsonplaceholder.typicode.com/comments?postId=1
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-03
    相关资源
    最近更新 更多