2016-04-04 3 views
0

У меня есть древовидная структура на странице, которая получает данные из ComboBox и мультиселектора. ComboBox содержит имя каждого ингредиента, а multiselect содержит возможные типы сумм, которые затем используются как имена для всех их дочерних узлов.Kendo UI TreeView: добавьте только узлы, не находящиеся в представлении

Дерево выглядит так:

  • Ингредиент 1
    • 100мг
    • 200мг
  • Ингредиент 2
    • 50мг
    • 100мг

Все работает отлично, за исключением того, что я могу добавить такое же значение в два раза, потому что я не могу проверить, если узел уже существует.

Вот функция, я использую, чтобы добавить новые элементы:

var addElement = function() { 

    var treeview = $("#ingredientTree").data("kendoTreeView"); 
    var multiselect = $("#ingredientAmount").data("kendoMultiSelect"); 
    var ingredientToAdd= $("#ingredient").val(); 

    // I allways get an empty array at this point. 
    var exinstingIngredient= treeview.findByText(ingredientToAdd); 

    var children = new Array(); 
    var amount = multiselect.value(); 

    for (var j = 0; j < amount.length; j++) { 

     children.push({ text: amount[j] }); 
    } 

    // it allways adds the items because the length is allways 0 
    if (exinstingIngredient.length === 0) { 
     treeview.append({ 
      text: ingredientToAdd, 
      items: children 
     }); 
    } 
} 

Я не понимаю, почему он не может найти существующий элемент даже я установить его имя в виде текста и поиск этого текста.

редактировать:

Здесь мы имеем TreeView:

@(Html.Kendo().TreeView().TemplateId("treeview-template").Name("ingredientTree")) 

Это является источником ингредиентов, он обрабатывает только простые строки:

@(Html.Kendo().ComboBox() 
    .Name("ingredient") 
    .DataSource(source => source.Read(r => r.Url(Url.HttpRouteUrl("DefaultApi", new { controller = "InternationalIngredients" })))) 
    .Events(events => events.Change("onIngredientChanged")) 
) 

После вы найдете источник количество, которое обрабатывает строки:

@(Html.Kendo().MultiSelect() 
    .Name("ingredientAmount") 
    .DataSource(source => source.Read(read => read.Url(Url.HttpRouteUrl("DefaultApi", new { controller = "InternationalIngredientAmount" })).Data("getIngredient")).ServerFiltering(true))) 

Это функция для определения выбранного ингредиента для вызова службы:

function getIngredient() { 
    return { ingredient: $("#ingredient").val() } 
} 
+0

Вы могли бы разместить код древа и источника данных? –

ответ

0

Я нашел причину моей проблемы в настоящее время. findByText, похоже, проверяет содержимое диапазона узлов с классом «k-in». К сожалению, этот контент изменяется при добавлении шаблона, как описано here. Поэтому, если вы хотите найти элемент с шаблоном, вы должны использовать findById или вы определяете свой шаблон так, как вы можете использовать jQuery.

 Смежные вопросы

  • Нет связанных вопросов^_^