Kendo 列表视图 - 单击已在列表视图之间移动的元素会产生不同的发件人对象结构

Kendo listview - clicking elements that have been moved between listviews yields a different sender object structure

我发现一个问题,如果我向我的列表框添加新选项,当我在新列表视图中单击那些新移动的选项时,event.sender 不再具有相同的对象结构。

我使用 ajax 事件将数据绑定到 Kendo 列表视图(这是在文档就绪时触发的方法):

var myListBoxId = 'myListBoxHtmlId';
$.post('myUrl/myController/controllerMethod', dataToPost)
   .done(function (response, status, jqxhr) {
      $('#' + myListBoxId').kendoListBox({
          dataSource:  response.myListProperty,
          connectWith: theOtherListBoxId,
          dropSources: [theOtherListBoxId],
          toolbar: {
                        position: "right",
                        tools: ["transferAllFrom", "transferAllTo", 
                                      "transferFrom", "transferTo"]
          },
          change:  function (event) {
                myJavascriptMethod(event);
          },
          dataTextField: 'propertyNameInObjectInMyPropertyList',
          dataValueField: 'anotherPropertyNameInObjectInMyPropertyList'
  });

您可以看到它将 'myJavascriptMethod(event)' 绑定为更改事件处理程序。

以下是我如何访问 myJavascriptMethod(event) 中的事件数据:

myJavascriptMethod(event){
    var selectedText = event.sender._target[0].innerHTML;
}

问题是,如果我修改选项(我使用 'transferFrom' 和 'transferTo' 在两个 kendo 列表视图之间传输选项),event.sender ._target 为空。我很难弄清楚在所有情况下我应该输入什么内容。

除了上面的示例代码,我还找到了这个,它有更多关于 .net-core 的列表视图的文档:

https://github.com/telerik/kendo-ui-core/blob/master/docs/api/javascript/ui/listbox.md

在 C# 列表中更改 return 对象时,我在对 AJAX 方法的响应中将数据源绑定到,我还注意到它是什么类型并不重要,只要 属性 名称与列表视图的 dataTextField 和 dataValueField 相匹配。

从列表视图中正确获取所选项目的解决方案是这样的(不需要对列表视图进行任何更改,如问题中所示):

//reformatted this as Javascript
//for typescript it was of this format:
//static myTypeScriptEvent(event){

function myJavascriptEvent(event){
    //This line was the fix / is key to the question:
    var dataItem = event.sender.dataItem(event.sender.select());
}

下面是绑定列表视图的 AJAX 方法的最小示例。在 document.ready 函数中包含对此方法的调用(thingId 是某个对象的 ID,该对象将在列表中包含子对象,然后将绑定到列表视图)。就我而言,我使用的是打字稿,您可能需要根据需要将其中一些转换为基本 javascript (非常接近,但可能需要进行一些细微的更改 - 如“$”字符所示,您还需要为此包含 jquery):

function bindListView( id: thingId ) {
    var dataToPost = {
         id: id
    };

    $.post('myUrl/myController/controllerMethod', dataToPost)
    .done(function (response, status, jqxhr) {
       $('#' + myListBoxId').kendoListBox({
          dataSource:  response.myList,
          connectWith: theOtherListBoxId,
          dropSources: [theOtherListBoxId],
          toolbar: {
                        position: "right",
                        tools: ["transferAllFrom", "transferAllTo", 
                                      "transferFrom", "transferTo"]
          },
          change:  function (event) {
                myJavascriptMethod(event);
          },
          dataTextField: 'Id',
          dataValueField: 'Name'
       });  //end of listView bind
      }); //end of $.post().done() function
}  //end of bindListView() function

最后,对于上述内容,您的控制器方法应该是这样的: 我将包括一个伪 class 并用数据填充它。 return 对象是 "response" 变量,无论您的列表名称是什么,都可以在数据源中像这样访问:response.listname。最后,无论这些列表中的对象类型是什么,这些对象上的 属性 名称只需要与列表视图的 dataTextField 和 dataValueField 相匹配。

//This will be the type of object I'm putting into the list that's 
//going into the object I'm returning

public MyClass {
    public int Id {get; set;}  //so we change the listview's dataValueField to Id
    public string Name {get; set;} //we change the listview's dataTextField to Name
}

//And this will be the overall type of object that will hold the list, will get
//returned, becoming the "response" in the AJAX .done:
public class MyReturnObject {
    public List MyList {get; set;}  //so we change the ListView's datasource to response.MyList
    //It may become myList, so you may need to look at the response object in the debugger.
}


[HttpPost]
public JsonResult MyControllerMethod(int id)
{
    //Create the return object, give it a new list, add things to the list
    //so the ListView can be bound:
    var myReturnObject = new MyReturnObject();
    myReturnObject.Mylist = new List();
    var object1 = new MyClass { Id = 1, Name = "Hello World" };
    var object2 = new MyClass { Id = 2, Name = "Hello again" };
    myReturnObject.MyList.Add(object1);
    myReturnObject.MyList.Add(object2);

    //Convert the return object and everything in it to Json and return it to
    //The AJAX method:
    return Json(myReturnObject);
}