KendoUI ComboBox Требуется Проверка не запускается, если значение первичного источника данных равно нулю

Проблема: у меня есть kendoui ComboBox, который настроен для автозаполнения с использованием первичного источника данных (редактируемая запись) и вторичного источника данных (данные для автозаполнения). Первичный источник данных имеет схему с полем:

'primaryDS_SelectedItemID': {
    type: 'number',
    defaultValue: null,
    nullable: false
}

к которому привязывается значение выбранных элементов в comboBox. Теперь, если я введу значение в поле со списком, которое не существует во вторичном источнике данных, значение primaryDS_SelectedItemID будет нулевым, что правильно. Но если я затем проверю форму с помощью kendoValidator, она пройдет. Но я этого не хочу. Мне нужно правило, указывающее, является ли он пустым или пустым, которое проверяет строку основного источника данных, который в настоящее время редактируется.

Я попытался создать это правило, но проблема в том, как получить строку, которая в настоящее время редактируется?

У меня есть простой пример, демонстрирующий проблему.

HTML:

<div id="form" style="padding:10px">
    <label>Item:</label>
    <input  id="comboBox"
            name="Item" data-role="combobox"
            data-placeholder="Type an Item Name"
            data-value-primitive="true"
            data-text-field="secondaryDS_Name"
            data-value-field="secondaryDS_ID"
            data-filter="startswith"
            data-auto-bind="false"
            data-bind="value: currentDataView.primaryDS_SelectedItemID"
            required />
    <span class="k-invalid-msg" data-for="Table Name"></span> 

    <button id="validate">Validate</button>
</div>

JavaScript:

$(document).ready(function () {
    var oViewModel = {
        currentDataView: {},
        primaryDataSource: new kendo.data.DataSource({
            schema: {
                model: { 
                    id: 'primaryDS_ID',
                    fields: {
                        'primaryDS_ID': {
                            type: 'number'
                        },
                        'primaryDS_SelectedItemID': {
                            type: 'number',
                            defaultValue: null,
                            nullable: false
                        }
                    }
                }
            }
        }),
        secondaryDataSource: new kendo.data.DataSource({
            data: [
                { secondaryDS_ID: 1, secondaryDS_Name: 'Item One' },
                { secondaryDS_ID: 2, secondaryDS_Name: 'Item Two' },
                { secondaryDS_ID: 3, secondaryDS_Name: 'Item Three' }
            ],
            total: 3,
            schema: {
                model: { 
                    id: 'secondaryDS_ID',
                    fields: {
                        'secondaryDS_ID': {
                            type: 'number'
                        },
                        'secondaryDS_Name': {
                            type: 'string'
                        }
                    }
                }
            }
        })
    },
    oValidator = $("#form").kendoValidator().data("kendoValidator"),
    oComboBox = null;

    oViewModel.currentDataView = oViewModel.primaryDataSource.add();
    kendo.init($('#comboBox'));
    oComboBox = $('#comboBox').data('kendoComboBox');
    oComboBox.setDataSource(oViewModel.secondaryDataSource);
    kendo.bind(oComboBox, oViewModel);

    $('#validate').on('click', function () {
        oValidator.validate();
    }); 
    $('#logRecord').on('click', function () {
        $('#status').text(JSON.stringify(oViewModel.currentDataView));
    }); 


});

Сценарий: http://jsfiddle.net/codeowl/Mq6ee/5/

Шаги репликации:

1) Нажмите кнопку «Проверить», и вы увидите, что проверка работает с пустым значением.

2) Введите значение: «test» в поле со списком и нажмите кнопку «Проверить». Вы увидите, что проверка не работает с нулевым значением.

3) Нажмите кнопку «Запись журнала», и вы увидите, что значение primaryDS_SelectedItemID равно нулю.

Спасибо за уделенное время,

С уважением,

Скотт


person user2109254    schedule 03.05.2014    source источник


Ответы (1)


Ваш primaryDS_SelectedItemID также равен нулю, если вы выбираете одно из значений поля со списком, поэтому ваш currentDataView не привязывается правильно.

Однако, если вам просто нужна проверка, был ли выбран один из ваших предварительно выбранных элементов, вы можете использовать настраиваемое правило и проверить, что привязывается к представлению вашего secondaryDataSource.

$(document).ready(function () {
    var oViewModel = {
        currentDataView: {},
        primaryDataSource: new kendo.data.DataSource({
            schema: {
                model: { 
                    id: 'primaryDS_ID',
                    fields: {
                        'primaryDS_ID': {
                            type: 'number'
                        },
                        'primaryDS_SelectedItemID': {
                            type: 'number',
                            defaultValue: null,
                            nullable: false
                        }
                    }
                }
            }
        }),
        secondaryDataSource: new kendo.data.DataSource({
            data: [
                { secondaryDS_ID: 1, secondaryDS_Name: 'Item One' },
                { secondaryDS_ID: 2, secondaryDS_Name: 'Item Two' },
                { secondaryDS_ID: 3, secondaryDS_Name: 'Item Three' }
            ],
            total: 3,
            schema: {
                model: { 
                    id: 'secondaryDS_ID',
                    fields: {
                        'secondaryDS_ID': {
                            type: 'number'
                        },
                        'secondaryDS_Name': {
                            type: 'string'
                        }
                    }
                }
            }
        })
    },
    oValidator = $("#form").kendoValidator({
      rules: {
        customRule: function(input) {
          if (input.is("[name=Item]") && oViewModel.secondaryDataSource._view.length == 0)
          	return false;
          return true;
        }
      },
      messages: {
        customRule: "Unknown item"
      }
    }).data("kendoValidator"),
    oComboBox = null;
    
    oViewModel.currentDataView = oViewModel.primaryDataSource.add();
    kendo.init($('#comboBox'));
    oComboBox = $('#comboBox').data('kendoComboBox');
    oComboBox.setDataSource(oViewModel.secondaryDataSource);
    kendo.bind(oComboBox, oViewModel);
    
    $('#validate').on('click', function () {
        oValidator.validate();
    }); 
    $('#logRecord').on('click', function () {
        $('#status').text(JSON.stringify(oViewModel.secondaryDataSource._view));
    }); 


});
<link href="http://cdn.kendostatic.com/2014.1.318/styles/kendo.default.min.css" rel="stylesheet"/>
<link href="http://cdn.kendostatic.com/2014.1.318/styles/kendo.common.min.css" rel="stylesheet"/>
<link href="http://netdna.bootstrapcdn.com/bootstrap/3.1.1/css/bootstrap.min.css" rel="stylesheet"/>
<script src="http://code.jquery.com/jquery-1.11.0.min.js"></script>
<script src="http://code.jquery.com/jquery-migrate-1.2.1.min.js"></script>
<script src="http://cdn.kendostatic.com/2014.1.318/js/kendo.all.min.js"></script>
<script src="http://netdna.bootstrapcdn.com/bootstrap/3.1.1/js/bootstrap.min.js"></script>

<div id="form" style="padding:10px">
        <label>Item:</label>
        <input  id="comboBox"
                name="Item" data-role="combobox"
                data-placeholder="Type an Item Name"
                data-value-primitive="true"
                data-text-field="secondaryDS_Name"
                data-value-field="secondaryDS_ID"
                data-filter="startswith"
                data-auto-bind="false"
                data-bind="value: currentDataView.primaryDS_SelectedItemID"
                required />
        <span class="k-invalid-msg" data-for="Table Name"></span> 

        <button id="validate">Validate</button>
        <button id="logRecord">Log Record</button>
        <div id="status" style="padding:10px"></div>
    </div>

person CennoxX    schedule 26.01.2018