2016-02-09 6 views
0

Я хочу спросить, можно ли повторно использовать удаленное связывание kendo.data.Datasource вместо создания нового с новыми параметрами.Как повторно использовать kendo ui remote binding datasource (change transport.read.data, затем обновить)

Мой сценарий заключается в том, что у меня есть окно поиска и вид списка. Когда пользователь вводит в поле поиска, запрос отправляется на сервер с параметром значения поля поиска. Я смог сделать это отлично, создав новый 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>

ответ

0

Что об этом? change-datasource-url-on-grid. Он использует функцию аналогичную вашей (options.transport.read.url) от кендо. Затем он обновляется с .refresh().

+0

Я фактически попробовал это на первый, но не работает. Может быть, потому, что я использую listview? –

0

Это, как я хотел бы сделать это 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); 
+0

Я также пробовал это, но 'this' доступен на' postId: this.get ("searchId") '. На самом деле это нечто иное, чем 'viewModel'. Я не знаю, не хватает ли чего-то. Можете ли вы поднять рабочий фрагмент? Просто клонируйте мою и редактируйте. –

+0

Да, вы правы. Вам нужно будет указать идентификатор поиска прямо к URL-адресу. Я отредактировал свой ответ. –

+0

Это не сработало. Я считаю, что переменная 'viewModel' еще не определена в' url: function() {...} ', а' this' относится к самому 'viewModel'. Ваша скрипка также не работает даже после того, как я исправлю URL REST. (Правильный - 'http: //jsonplaceholder.typicode.com/comments? PostId = 1') –