簡體   English   中英

可能的錯誤-在widget.set('options',[])之后觸發事件更改

[英]Possible bug - Event change fires after widget.set('options', [])

當前,我正在使用dijit / form / Select來顯示選項列表,並且我需要以編程方式更新dijit/form/Select

目前我正在使用.set('value', ...); 但我注意到事件change已觸發(在我的情況下是不希望的)。

我需要能夠更新小部件並選擇一個值,而不會觸發change事件。

change事件afaik,僅當用戶“更改”選擇列表的值時才應觸發該事件。

 require(["dijit/form/Select", "dojo/data/ObjectStore", "dojo/store/Memory", "dojo/domReady!" ], function(Select) { var options = [{ label: "TN", value: "Tennessee" }, { label: "VA", value: "Virginia", selected: true }, { label: "WA", value: "Washington" }, { label: "FL", value: "Florida" }, { label: "CA", value: "California" }]; var s = new Select({ options: options }, "target"); s.startup(); s.on("change", function() { console.log("my value: " + s.get("value")) }); // updating options options.push({ label: "MI", value: "Milan", selected: true }); s.set('options', options); s.reset(); // issue here, the following line trigger event change s.set('value', 'mi'); }) 
 <link href="//ajax.googleapis.com/ajax/libs/dojo/1.10.0/dijit/themes/claro/claro.css" rel="stylesheet" /> <script src="//ajax.googleapis.com/ajax/libs/dojo/1.10.4/dojo/dojo.js"></script> <body class="claro"> <div id="target"></div> </body> 

_setValueAttr還具有第二個參數- priorityChange 如果將其設置為false,則不會觸發onChange事件。

API文檔版本1.6開始(請參見方法中的_setValueAttr):

_setValueAttr
覆蓋dijit.form._FormValueWidget,dijit.form._FormSelectWidget
設置小部件的值。 如果值已更改,則觸發onChange事件,除非將priorityChange指定為null(或false?)。

順便說一句。 如果要添加一個選項,則無需替換整套選項-您可以調用s.addOption(newOption)

 require(["dijit/form/Select", "dojo/data/ObjectStore", "dojo/store/Memory", "dojo/domReady!" ], function(Select) { var options = [{ label: "TN", value: "Tennessee" }, { label: "VA", value: "Virginia", selected: true }, { label: "WA", value: "Washington" }, { label: "FL", value: "Florida" }, { label: "CA", value: "California" }]; var s = new Select({ options: options }, "target"); s.startup(); s.on("change", function() { console.log("my value: " + s.get("value")) }); // updating options options.push({ label: "MI", value: "Milan", selected: true }); s.set('options', options); s.reset(); // issue here, the following line trigger event change s.set('value', 'Milan', false); }) 
 <link href="//ajax.googleapis.com/ajax/libs/dojo/1.10.0/dijit/themes/claro/claro.css" rel="stylesheet" /> <script src="//ajax.googleapis.com/ajax/libs/dojo/1.10.4/dojo/dojo.js"></script> <body class="claro"> <div id="target"></div> </body> 

我使用以下方法解決了此問題:

  myWidget.set('_onChangeActive', false); // prevent firing change
  myWidget.set('value', 'Milan', false);
  myWidget.set('_onChangeActive', true); // reset to default

當在多個窗口小部件上連續使用.set()時,該方法也有效。

如果一次只更改一個小部件,則.set() false作為第三個參數傳遞給.set()

s.set('value', 'Milan', false);

注意:我在官方文檔中找不到使用.set()第三個參數的參考:

相關問題:以編程方式更改值時,Dojo選擇onChange事件觸發

 require(["dijit/form/Select", "dojo/data/ObjectStore", "dojo/store/Memory", "dojo/domReady!" ], function(Select) { var options = [{ label: "TN", value: "Tennessee" }, { label: "VA", value: "Virginia", selected: true }, { label: "WA", value: "Washington" }, { label: "FL", value: "Florida" }, { label: "CA", value: "California" }]; var s = new Select({ options: options }, "target"); s.startup(); s.on("change", function() { console.log("my value: " + s.get("value")) }); // updating options options.push({ label: "MI", value: "Milan", selected: true }); s.set('options', options); s.reset(); s.set('_onChangeActive', false); // prevent firing change s.set('value', 'Milan', false); s.set('_onChangeActive', true); }) 
 <link href="//ajax.googleapis.com/ajax/libs/dojo/1.10.0/dijit/themes/claro/claro.css" rel="stylesheet" /> <script src="//ajax.googleapis.com/ajax/libs/dojo/1.10.4/dojo/dojo.js"></script> <body class="claro"> <div id="target"></div> </body> 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM