Hi all!
I've an unexpected behavior with ComboBox in case MVVM usage
The issue exists for the case when I have preselected data.SelectedFolder value - see below
shtml code (template for 'Edit' popup window, I've deleted extra text fields from the template):
<
script
id
=
"editMessageDetailsTemplate"
type
=
"text/x-kendo-template"
>
<
form
id
=
"editMessageDetailsForm"
>
<
div
class
=
"wrapperClass"
>
<
div
class
=
"col-md-4"
style
=
"padding-top:15px;"
>
<
label
class
=
"control-label"
for
=
"FolderID"
>@Global.Folder</
label
>
</
div
>
<
div
class
=
"col-md-11"
>
<
select
id
=
"FolderID"
name
=
"FolderID"
data-val-required
=
"@Global.FieldFolderMustBeSet"
data-val-number
=
"@Global.FolderDoesNotExist"
data-bind
=
"value: data.SelectedFolder"
placeholder
=
"@Global.PleaseSelect"
data-val
=
"true"
data-value-update
=
"keyup"
></
select
>
<
span
class
=
"k-invalid-msg"
data-for
=
"FolderID"
style
=
"width: 100%;"
></
span
>
</
div
>
</
div
>
<
div
class
=
"dialogButtons"
>
<
button
data-bind
=
"click: onSave, disabled: data.isNotValid"
id
=
"buttonOk"
type
=
"submit"
data-role
=
"button"
class
=
"k-button k-button-icontext"
role
=
"button"
aria-disabled
=
"false"
tabindex
=
"0"
>
<
span
class
=
"k-icon k-i-save"
></
span
>
@Global.Save
</
button
>
<
button
data-bind
=
"click: onCancel"
id
=
"buttonCancel"
type
=
"button"
data-role
=
"button"
class
=
"k-button"
role
=
"button"
aria-disabled
=
"false"
tabindex
=
"0"
>@Global.Cancel</
button
>
</
div
>
</
form
>
</
script
>
js code - popup dialog
var $editMessageDetailsDiv = $("<
div
>", { "id": self.uid });
$("body").append($editMessageDetailsDiv);
var dialog = $("#" + self.uid).kendoWindow(
{
"close": destroyDialog,
"modal": true,
"iframe": true,
"draggable": true,
"scrollable": true,
"pinned": false,
"title": "Edit",
"appendTo": "body",
"resizable": true,
"width": 450,
"height": 350,
"minWidth": 450,
"minHeight": 350,
"actions": ["Maximize", "Close"],
"content": {
template: $("#" + self.contentTemplate).html()
}
}).data("kendoWindow");
dialog.center();
dialog.open();
var formViewModel = new EditMessageDetailsFormViewModel({
FolderID: 123, // !!! existing folder ID from data source !!!
submitCallback: function (model) {
//
},
submitUpdate: function (response) {
//
},
submitError: function (model) {
//
}
});
kendo.bind($editMessageDetailsDiv, formViewModel);
js code - model
function EditMessageDetailsFormViewModel(options) {
var self = this;
self.data = kendo.observable({
SelectedFolder: options.FolderID
});
self.onCancel = function (event) {
options.closeCallback();
kendo.destroy();
};
self.init = function () {
self._initKendo();
var allFoldersPromise = self._getAllFoldersPromise();
allFoldersPromise.done(function (folders) {
self.FolderID.data(folders);
});
};
self._initKendo = function () {
kendo.inputTrimEnabled();
var validatable = self._getValidator();
validatable.validate();
validatable.hideMessages();
$("#FolderID").kendoComboBox({
dataTextField: "FolderName",
dataValueField: "FolderID",
filter: "Contains"
});
self.FolderID = self._getComboBox('FolderID').dataSource;
};
self.onSave = function (event) {
event.preventDefault();
if (self.validate()) {
var params = {
FolderID: self.data.get('SelectedFolder'),
};
// save func
}
};
self.validate = function () {
return self._getValidator().validate();
}
self.resetValidator = function () {
var validator = self._getValidator();
validator.hideMessages();
}
self._getValidator = function () {
return $("#editMessageDetailsForm").kendoValidator().data("kendoValidator");
}
self._getComboBox = function (id) {
return $("#" + id).data("kendoComboBox");
}
self._getAllFoldersPromise = function () {
var promise = $.get(UrlUtils.URL("Messages", "GetFolders")); // back end func to get folders
promise.fail(function () {
showError("err!");
});
return promise;
}
self.init();
}
When popup window opened -> Folder preselected -> this is expected, ok
But a user can't clear this selection using embedded 'clear' cross into ComboBox area.
Any thoughts or suggestions would be useful.
Thanks.