不能读取属性'multiSelectLabelText'的定义

Cannot read property 'multiSelectLabelText' of undefined

本文关键字:定义 multiSelectLabelText 不能读 不能 读取 属性      更新时间:2023-09-26

我使用CheckedMultiSelect的dojo在这种方式,

var MyCheckedMultiSelect = declare(CheckedMultiSelect, {
         startup: function() {
             this.inherited(arguments);
             setTimeout(lang.hitch(this, function() {
              this.dropDownButton.set("label", "User Preferences");
             }));
         }v
 var select =   new MyCheckedMultiSelect({
        dropDown: true,
        label: "Preferences",
        multiple: true,
        name: 'state',
        invalidMessage: 'ERROR',
        onChange: getValues,
        required: true
    }, "stateSelect");
    form = new Form({
    style: 'display:inline'
    }, 'formPref');
    select.startup();
select._nlsResources.multiSelectLabelText = 'User Preferences';

我想覆盖这个小部件的消息"0项(s)选择",默认情况下是一些其他消息,如"用户偏好"..所以我用这个select._nlsResources。multiSelectLabelText = 'User Preferences';

但是我的页面第一次根本没有加载,它挂起了下面的错误"无法读取未定义的属性'multiSelectLabelText' "..提供一些指针来调试这个问题

我猜CheckedMultiSelect指的是dojox.form.CheckedMultiSelect
如果是,尝试这样做:

var MyCheckedMultiSelect = declare(CheckedMultiSelect, {
     postMixInProperties: function() {
          this.inherited(arguments);
          this._nlsResources.multiSelectLabelText = 'User Preferences';
     }
     startup: function() {
         this.inherited(arguments);
         setTimeout(lang.hitch(this, function() {
          this.dropDownButton.set("label", "User Preferences");
         }));
     }
 });

覆盖被移动到您的MyCheckedMultiSelect小部件内。

这是CheckedMultiSelect的原始postMixInProperties方法:

postMixInProperties: function(){
    this.inherited(arguments);
    this._nlsResources = i18n.getLocalization("dojox.form", "CheckedMultiSelect", this.lang);
    if(this.invalidMessage == "$_unset_$"){ this.invalidMessage = this._nlsResources.invalidMessage; }
},

原始postMixInProperties将首先运行,然后您的自定义小部件的postMixInProperties将覆盖this._nlsResources.multiSelectLabelText

的值

查看代码片段:

require(['dojo/_base/declare', 'dojox/form/CheckedMultiSelect', 'dojo/domReady!'], function(declare, CheckedMultiSelect) {
  
  var MyCheckedMultiSelect = declare(CheckedMultiSelect, {
     postMixInProperties: function() {
       this.inherited(arguments);
       this._nlsResources.multiSelectLabelText = 'This is multiSelectLabelText';
     },
     startup: function() {
       this.inherited(arguments);
       this.dropDownButton.set("label", "This is dropDownButton label");
     }
  });
  
  var x = new MyCheckedMultiSelect({
    dropDown: true,
    label: "This is MyCheckedMultiSelect label",
    multiple: true,
    name: 'state',
    invalidMessage: 'ERROR',
    onChange: function() {},
    required: true,
    options: [
      { value: 'option1', label: 'label option 1' },
      { value: 'option2', label: 'label option 2' },
      { value: 'option3', label: 'label option 3' }
    ]
  
  });
  x.placeAt(document.getElementById('test'));
  x.startup();
});
<script src="//ajax.googleapis.com/ajax/libs/dojo/1.10.4/dojo/dojo.js"></script>
<link rel="stylesheet" type="text/css" href="http://ajax.googleapis.com/ajax/libs/dojo/1.10.4/dojo/resources/dojo.css"> 
<link rel="stylesheet" type="text/css" href="http://ajax.googleapis.com/ajax/libs/dojo/1.10.4/dijit/themes/tundra/tundra.css">
<link rel="stylesheet" type="text/css" href="http://ajax.googleapis.com/ajax/libs/dojo/1.10.4/dojox/form/resources/CheckedMultiSelect.css">
<div id="test" class="tundra">
</div>