[英]How do I ensure a select change event fires AFTER ngmodel is set in Angular2?
[英]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.