Kendo UI TreeView:仅添加视图中不存在的节点
Kendo UI TreeView: Add only nodes not exisisting in the view
我在页面上有树视图,它从 ComboBox 和多选框获取数据。 ComboBox 包含每种成分的名称,而 multiselect 包含可能的数量类型,然后将其用作所有子节点的名称。
这棵树看起来像这样:
- 成分 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
});
}
}
我不明白为什么即使我将其名称设置为文本并搜索此文本也找不到现有元素。
编辑:
这里有树视图:
@(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() }
}
我现在找到问题的原因了。 findByText 似乎用 class "k-in" 检查节点的内容。不幸的是,当您按照 here 所述添加模板时,此内容会被修改。因此,如果您想使用模板查找元素,您应该使用 findById 或以可以使用 jQuery.
的方式定义模板
我在页面上有树视图,它从 ComboBox 和多选框获取数据。 ComboBox 包含每种成分的名称,而 multiselect 包含可能的数量类型,然后将其用作所有子节点的名称。
这棵树看起来像这样:
- 成分 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
});
}
}
我不明白为什么即使我将其名称设置为文本并搜索此文本也找不到现有元素。
编辑:
这里有树视图:
@(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() }
}
我现在找到问题的原因了。 findByText 似乎用 class "k-in" 检查节点的内容。不幸的是,当您按照 here 所述添加模板时,此内容会被修改。因此,如果您想使用模板查找元素,您应该使用 findById 或以可以使用 jQuery.
的方式定义模板