2017-06-02 12 views
2

次のコードはテキストボックスで機能し、デフォルトのバリデータ関数を自分でオーバーライドして、入力を無効にしてreturn falseにします。しかし、これはFilteringSelect入力では全く機能しません。次のコードは常にtrueを返します。実際には私のカスタム検証関数を入力することはありません。FilteringSelect入力でカスタム検証関数を起動できません

これは、期待されるものとは異なるバリデータを実行していることを意味します。または、誤った入力にバリデータを設定しています(レンダリング時に複数あります)。

var customValidator = function (value) { 
    console.log("custom validator: ", value); 
    return false; //force an invalid result 
}; 

formelement.theInput.set('validator', customValidator); 

var res = formelement.theInput.validate(); 
console.log("res: ", res); 

ウィジェットテンプレートは、この

<div data-dojo-attach-point="formelement" style="position: absolute; left: 222px; top: 75px; width: 200px; border-width: 1px; border-style: none; border-color: black;" class="fe-dropdown resize-handle" id="4180a54b-3931-472e-8c5f-212bfddc88b2" widgetid="uniqName_10_10"> 
    <div class="dijit dijitReset dijitInline dijitLeft fe-element dijitTextBox dijitComboBox dijitValidationTextBox dijitTextBoxFocused dijitComboBoxFocused dijitValidationTextBoxFocused dijitFocused" id="widget_dijit_form_FilteringSelect_28" role="combobox" aria-haspopup="true" data-dojo-attach-point="_popupStateNode" widgetid="dijit_form_FilteringSelect_28" aria-disabled="false" popupactive="true" aria-expanded="false" aria-owns="dijit_form_FilteringSelect_28_popup"> 
    <div class="dijitReset dijitRight dijitButtonNode dijitArrowButton dijitDownArrowButton dijitArrowButtonContainer" data-dojo-attach-point="_buttonNode" role="presentation"> 
     <input class="dijitReset dijitInputField dijitArrowButtonInner" value="▼ " type="text" tabindex="-1" readonly="readonly" role="button presentation" aria-hidden="true"> 
    </div> 
    <div class="dijitReset dijitValidationContainer"> 
     <input class="dijitReset dijitInputField dijitValidationIcon dijitValidationInner" value="Χ " type="text" tabindex="-1" readonly="readonly" role="presentation"> 
    </div> 
    <div class="dijitReset dijitInputField dijitInputContainer"> 
     <input class="dijitReset dijitInputInner" type="text" autocomplete="off" data-dojo-attach-point="textbox,focusNode" role="textbox" aria-autocomplete="both" tabindex="0" id="dijit_form_FilteringSelect_28" aria-required="false" value="" aria-invalid="false" maxlength="25" style="font-family: Arial; font-weight: 400; font-style: normal; color: black; text-decoration: none; text-align: left; background-color: transparent;"> 
     <input type="hidden" value="CA"> 
    </div> 
</div> 
</div> 

答えて

2

ようなときにレンダリングルックスisValid機能によるIthinkこの、それはそれそう文句を言わない、FilteringSelectの中でオーバーライドされたこの

<div data-dojo-attach-point="formelement" > 
    <select data-dojo-type="dijit/form/FilteringSelect" data-dojo-attach-point="theInput" 
      data-dojo-props="labelAttr:'text', searchAttr:'text', required:false, " > 
    </select> 
</div> 

LKEに見えますtextBoxと同じ動作をします。私が提案する何

は怒鳴るようにカスタムバリデータを設定した後、再びのisValidをovverideすることです:ベローはサンプルスニペットで

formelement.theInput.isValid = 
    function() { 
      return this.validator(this.textbox.value,this.get('constraints')); 
     // force new validator above 
    } 

require(["dijit/registry", "dijit/form/FilteringSelect","dojo/on","dijit/form/Button","dojo/ready"], 
 
\t \t function(registry,dom,On,Button,ready){ 
 
    \t \t ready(function(){ 
 
      var customValidator = function (value) { 
 
       console.log("custom validator: ", value); 
 
       return false; //force an invalid result 
 
      }; 
 
      formelement = registry.byId("formelement"); 
 
      formelement.set('validator', customValidator); 
 
      
 
      formelement.isValid = function() { 
 
      return this.validator(this.textbox.value, this.get('constraints'));} 
 

 
      var res = formelement.validate(); 
 
      console.log("res: ", res); 
 
      
 
      var btn = registry.byId("btn"); 
 
      On(btn,"click",function(){ 
 
      console.log(formelement.validate()); 
 
      }); 
 
     }) 
 
    });
<script> 
 
dojoConfig = { 
 
    isDebug: true, 
 
    parseOnLoad: true, 
 
}; 
 
</script> 
 
<script src="//ajax.googleapis.com/ajax/libs/dojo/1.10.4/dojo/dojo.js"></script> 
 
<link href="//ajax.googleapis.com/ajax/libs/dojo/1.10.0/dijit/themes/claro/claro.css" rel="stylesheet"/> 
 

 
<body class="claro"> 
 
<div data-dojo-type="dijit/form/Button" id="btn"> Validate </div> 
 
<div data-dojo-attach-point="formelement" > 
 
    <select id="formelement" data-dojo-type="dijit/form/FilteringSelect" data-dojo-attach-point="theInput" 
 
      data-dojo-props="labelAttr:'text', searchAttr:'text', required:false, " > 
 
    </select> 
 
</div> 
 
</body>

+0

それは作るんセンス? –

+1

バリデータの面白い使用 – Radex

+1

私はこのコードをテストしましたが、これはうまくいきました(バリデータ、テキストボックス、filteringselect、numbertextboxなどを使用するすべての入力タイプに対して)、ありがとうございました。 – erotavlas

関連する問題