无法使用 jquery 在基诺面板栏中获取正确的值
Unable to get the proper value inside a Keno Panel Bar using jquery
一般信息
我构建了一个填充有数据的 kendo 面板栏,它有一个选项,使用户能够编辑展开面板时显示的预填充数据。面板栏嵌套在列表视图中,面板展开时显示的 HTML 来自 Kendo 模板。
当前问题
当面板展开并且用户选择编辑内容并添加时,他们按批准按钮添加,但我收到的文本不正确。我只得到应该位于第一个面板中的信息。无论我选择编辑和添加哪个面板,我都只推送位于第一个面板中的数据。
Html
<div class="padding" style="display:none;" id="ApprovalFormWindow">
<div class="container">
<!--<div id="descriptionColumn" style="display:none"><b id="description">Title</b><b id="date">Modified Date</b></div>-->
<div id="descriptionColumn" style="display:none">
<div style="width: 95%; display: table;">
<div style="display: table-row">
<div style="width: 40px; display: table-cell; vertical-align:top;"><b>Title</b></div>
</div>
</div>
</div>
<ul id="listView" style="display:none"></ul>
<div id="pager" style="display:none"></div>
</div>
</div>
<script type="text/x-kendo-tmpl" id="ApprovalContentTemplate">
<li>
<table style="width: 95%;">
<tr>
<td class="selectedValue" style="width:40%; vertical-align:top;">#:Description#</td>
</tr>
</table>
<div id="topTabPanel" style="margin-top: -4px; padding-top: 5px; padding-bottom: 5px; border: 1px solid lightgray !important">
<label style="margin-left : 5px;" for="EditCheckBox">
Edit<input class="editBox" type="checkbox" id="EditCheckBox" value="true" style="margin-left: 5px;">
</label>
<button type="button" class="PreviewItem" style="border: 2px none; border-radius: 25px; margin-left: 15px;">Preview</button>
<button type="button" class="ApproveItem" style="border: 2px none; border-radius: 25px; margin-left: 15px;">Approve</button>
</div>
<div id ="PanelSelected" class="row demo-section k-content" style="border-top: 4px solid dodgerblue; border-bottom: 4px solid dodgerblue;">
<div class="col-xs-11" style="margin-top: 5px;">
<form class="form-inline">
<div class="form-group">
<label for="Title" class="required">Title</label>
<div><textarea class="k-textbox ApproversPanel" id="Title" name="Title" style="width: 220px;" readonly>#:Name#</textarea></div>
</div>
<div class="form-group">
<label for="KeyWords" class="required">KeyWords</label>
<div><textarea class="k-textbox ApproversPanel" id="KeyWords" name="KeyWords" style="width: 220px;" readonly>#:KeyWords#</textarea></div>
</div>
<div class="form-group">
<label for="jandra" class="required">Description</label>
<div><textarea class="k-textbox ApproversPanel" id="jandra" name="jandra" style="width: 220px;" readonly>#:jandra#</textarea></div>
</div>
<div class="form-group">
<label for="Summary" class="required">Summary</label>
<div><textarea class="k-textbox ApproversPanel" id="Summary" name="Summary" style="height: 100px; width: 220px;" readonly>#:Summary#</textarea></div>
</div>
</form>
</div>
</div>
</li>
Javascript
serverResponse = [
{
Name: "Test1",
KeyWords: "KeyWord1",
jandra: "Country",
Summary: "Test Item 1",
},
{
Name: "Test2",
KeyWords: "KeyWord2",
jandra: "Rap",
Summary: "Test Item 2",
},
{
Name: "Test3",
KeyWords: "KeyWord3",
jandra: "Pop",
Summary: "Test Item 3",
},
{
Name: "Test4",
KeyWords: "KeyWord4",
jandra: "Rock",
Summary: "Test Item 4",
},
{
Name: "Test5",
KeyWords: "KeyWord5",
jandra: "Blues",
Summary: "Test Item 5",
},
];
var selectedContent;
$("#listView").kendoListView({
dataSource: serverResponse,
autoBind: false,
pageable: true,
template: kendo.template($("#ApprovalContentTemplate").html()),
dataBound: function () {
$("#listView").kendoPanelBar({
// Made it single, however multiple would be nice
expandMode: "single",
select: function (e) {
var retrievedContent = serverResponse._data;
for (var x = 0; x < retrievedContent.length; x++) {
if (e.item.dataset.uid === retrievedContent[x].uid) {
selectedContent = retrievedContent[x];
}
}
},
});
$(".editBox").each(function (e) {
$(this).click(function (d) {
if ($(this).is(":checked")) {
$(".ApproversPanel").attr("readonly", false);
}
else {
$(".ApproversPanel").attr("readonly", true);
$("#ListItemTitle").val(selectedContent.Name);
$("#ListItemKeyWords").val(selectedContent.KeyWords);
$("#ListItemDescription").val(selectedContent.Description);
$("#ListItemSummary").val(selectedContent.ContentSummary);
var testThis = 0;
}
});
});
$(".PreviewItem").each(function (e) {
$(this).click(function (d) {
// Logic not built
});
});
$(".ApproveItem").each(function (e) {
$(this).click(function (d) {
var value = $("#PanelSelected").find(".ApproversPanel").children();
/*
* when a person push this to the datasource it will always push
* the first object in the array no mattyer what panel they selected to edit
* Name: "Test1",
* KeyWords: "KeyWord1",
* jandra: "Country",
* Summary: "Test Item 1",
*/
GetCurrentValue();
});
});
function GetCurrentValue() {
$(".ApproversPanel").each(function (e) {
var title = $("#Title").val();
var KeyWords = $("#KeyWords").val();
var Description = $("#jandra").val();
var ContentSummary = $("Summary").val();
/*
* This gives me the same results. not matter what panel I selected to edit and
* add I always get the first object.
* Name: "Test1",
* KeyWords: "KeyWord1",
* jandra: "Country",
* Summary: "Test Item 1",
*/
});
};
},
});
好吧...您有 5 个面板,每个面板包含一组文本框,它们都具有相同的 ID 和名称。 id 必须是唯一的。您在 GetCurrentValue() 中的 jquery 选择器将始终 return 第一个和第一个,因为 jquery 假定一个唯一的 id 并停止(它不知道您想要第 4 个输入具有相同的 ID)。您必须以某种方式使每个面板独一无二,并使用适当的选择器。
例如,您可以将“批准”按钮点击更改为
$(".ApproveItem").each(function (e) {
$(this).click(function (d) {
var panel = $($(this).closest("li"));
var data = {
Name: panel.find("#Title").val(),
KeyWords: panel.find("#KeyWords").val(),
jandra: panel.find("#jandra").val(),
Summary: panel.find("#Summary").val()
}
console.log(data);
//var value = $("#PanelSelected").find(".ApproversPanel").children();
/*
* when a person push this to the datasource it will always push
* the first object in the array no mattyer what panel they selected to edit
* Name: "Test1",
* KeyWords: "KeyWord1",
* jandra: "Country",
* Summary: "Test Item 1",
*/
//GetCurrentValue();
});
});
这会获取与所点击按钮关联的面板的引用(使用最近),然后使用它来优化数据选择器以找到正确面板的子项。
http://dojo.telerik.com/@Stephen/avitO
我肯定有更好的方法可以使用 Kendo 的 MVVM(与此处的技术相似但不相同:)或 adding/removing 类 到所选面板以用于构建更具体的选择器。
一般信息
我构建了一个填充有数据的 kendo 面板栏,它有一个选项,使用户能够编辑展开面板时显示的预填充数据。面板栏嵌套在列表视图中,面板展开时显示的 HTML 来自 Kendo 模板。
当前问题
当面板展开并且用户选择编辑内容并添加时,他们按批准按钮添加,但我收到的文本不正确。我只得到应该位于第一个面板中的信息。无论我选择编辑和添加哪个面板,我都只推送位于第一个面板中的数据。
Html
<div class="padding" style="display:none;" id="ApprovalFormWindow">
<div class="container">
<!--<div id="descriptionColumn" style="display:none"><b id="description">Title</b><b id="date">Modified Date</b></div>-->
<div id="descriptionColumn" style="display:none">
<div style="width: 95%; display: table;">
<div style="display: table-row">
<div style="width: 40px; display: table-cell; vertical-align:top;"><b>Title</b></div>
</div>
</div>
</div>
<ul id="listView" style="display:none"></ul>
<div id="pager" style="display:none"></div>
</div>
</div>
<script type="text/x-kendo-tmpl" id="ApprovalContentTemplate">
<li>
<table style="width: 95%;">
<tr>
<td class="selectedValue" style="width:40%; vertical-align:top;">#:Description#</td>
</tr>
</table>
<div id="topTabPanel" style="margin-top: -4px; padding-top: 5px; padding-bottom: 5px; border: 1px solid lightgray !important">
<label style="margin-left : 5px;" for="EditCheckBox">
Edit<input class="editBox" type="checkbox" id="EditCheckBox" value="true" style="margin-left: 5px;">
</label>
<button type="button" class="PreviewItem" style="border: 2px none; border-radius: 25px; margin-left: 15px;">Preview</button>
<button type="button" class="ApproveItem" style="border: 2px none; border-radius: 25px; margin-left: 15px;">Approve</button>
</div>
<div id ="PanelSelected" class="row demo-section k-content" style="border-top: 4px solid dodgerblue; border-bottom: 4px solid dodgerblue;">
<div class="col-xs-11" style="margin-top: 5px;">
<form class="form-inline">
<div class="form-group">
<label for="Title" class="required">Title</label>
<div><textarea class="k-textbox ApproversPanel" id="Title" name="Title" style="width: 220px;" readonly>#:Name#</textarea></div>
</div>
<div class="form-group">
<label for="KeyWords" class="required">KeyWords</label>
<div><textarea class="k-textbox ApproversPanel" id="KeyWords" name="KeyWords" style="width: 220px;" readonly>#:KeyWords#</textarea></div>
</div>
<div class="form-group">
<label for="jandra" class="required">Description</label>
<div><textarea class="k-textbox ApproversPanel" id="jandra" name="jandra" style="width: 220px;" readonly>#:jandra#</textarea></div>
</div>
<div class="form-group">
<label for="Summary" class="required">Summary</label>
<div><textarea class="k-textbox ApproversPanel" id="Summary" name="Summary" style="height: 100px; width: 220px;" readonly>#:Summary#</textarea></div>
</div>
</form>
</div>
</div>
</li>
Javascript
serverResponse = [
{
Name: "Test1",
KeyWords: "KeyWord1",
jandra: "Country",
Summary: "Test Item 1",
},
{
Name: "Test2",
KeyWords: "KeyWord2",
jandra: "Rap",
Summary: "Test Item 2",
},
{
Name: "Test3",
KeyWords: "KeyWord3",
jandra: "Pop",
Summary: "Test Item 3",
},
{
Name: "Test4",
KeyWords: "KeyWord4",
jandra: "Rock",
Summary: "Test Item 4",
},
{
Name: "Test5",
KeyWords: "KeyWord5",
jandra: "Blues",
Summary: "Test Item 5",
},
];
var selectedContent;
$("#listView").kendoListView({
dataSource: serverResponse,
autoBind: false,
pageable: true,
template: kendo.template($("#ApprovalContentTemplate").html()),
dataBound: function () {
$("#listView").kendoPanelBar({
// Made it single, however multiple would be nice
expandMode: "single",
select: function (e) {
var retrievedContent = serverResponse._data;
for (var x = 0; x < retrievedContent.length; x++) {
if (e.item.dataset.uid === retrievedContent[x].uid) {
selectedContent = retrievedContent[x];
}
}
},
});
$(".editBox").each(function (e) {
$(this).click(function (d) {
if ($(this).is(":checked")) {
$(".ApproversPanel").attr("readonly", false);
}
else {
$(".ApproversPanel").attr("readonly", true);
$("#ListItemTitle").val(selectedContent.Name);
$("#ListItemKeyWords").val(selectedContent.KeyWords);
$("#ListItemDescription").val(selectedContent.Description);
$("#ListItemSummary").val(selectedContent.ContentSummary);
var testThis = 0;
}
});
});
$(".PreviewItem").each(function (e) {
$(this).click(function (d) {
// Logic not built
});
});
$(".ApproveItem").each(function (e) {
$(this).click(function (d) {
var value = $("#PanelSelected").find(".ApproversPanel").children();
/*
* when a person push this to the datasource it will always push
* the first object in the array no mattyer what panel they selected to edit
* Name: "Test1",
* KeyWords: "KeyWord1",
* jandra: "Country",
* Summary: "Test Item 1",
*/
GetCurrentValue();
});
});
function GetCurrentValue() {
$(".ApproversPanel").each(function (e) {
var title = $("#Title").val();
var KeyWords = $("#KeyWords").val();
var Description = $("#jandra").val();
var ContentSummary = $("Summary").val();
/*
* This gives me the same results. not matter what panel I selected to edit and
* add I always get the first object.
* Name: "Test1",
* KeyWords: "KeyWord1",
* jandra: "Country",
* Summary: "Test Item 1",
*/
});
};
},
});
好吧...您有 5 个面板,每个面板包含一组文本框,它们都具有相同的 ID 和名称。 id 必须是唯一的。您在 GetCurrentValue() 中的 jquery 选择器将始终 return 第一个和第一个,因为 jquery 假定一个唯一的 id 并停止(它不知道您想要第 4 个输入具有相同的 ID)。您必须以某种方式使每个面板独一无二,并使用适当的选择器。
例如,您可以将“批准”按钮点击更改为
$(".ApproveItem").each(function (e) {
$(this).click(function (d) {
var panel = $($(this).closest("li"));
var data = {
Name: panel.find("#Title").val(),
KeyWords: panel.find("#KeyWords").val(),
jandra: panel.find("#jandra").val(),
Summary: panel.find("#Summary").val()
}
console.log(data);
//var value = $("#PanelSelected").find(".ApproversPanel").children();
/*
* when a person push this to the datasource it will always push
* the first object in the array no mattyer what panel they selected to edit
* Name: "Test1",
* KeyWords: "KeyWord1",
* jandra: "Country",
* Summary: "Test Item 1",
*/
//GetCurrentValue();
});
});
这会获取与所点击按钮关联的面板的引用(使用最近),然后使用它来优化数据选择器以找到正确面板的子项。
http://dojo.telerik.com/@Stephen/avitO
我肯定有更好的方法可以使用 Kendo 的 MVVM(与此处的技术相似但不相同: