Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/402.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在下拉列表jquery中首先选择_Javascript_Meteor_Html Select - Fatal编程技术网

Javascript 在下拉列表jquery中首先选择

Javascript 在下拉列表jquery中首先选择,javascript,meteor,html-select,Javascript,Meteor,Html Select,我知道Meteor支持事件,但我不确定在第一次选择某个项目时是否有下拉单击事件。理想情况下,这将只在第一次选择下拉列表中的项目时运行代码,而不是在以后的任何时间 以下是html代码: <select id="module-select" class="form-control"> <option disabled="disabled" selected="selected">Select Assessment</option&

我知道Meteor支持事件,但我不确定在第一次选择某个项目时是否有下拉单击事件。理想情况下,这将只在第一次选择下拉列表中的项目时运行代码,而不是在以后的任何时间

以下是html代码:

        <select id="module-select" class="form-control">
            <option disabled="disabled" selected="selected">Select Assessment</option>
            {{#each modules}}
                 <option value="{{this.name}}">{{this.name}}</option>
            {{/each}}
        </select>
理想情况下,这将只在第一次选择下拉列表中的项目时运行代码,而不是在以后的任何时间

在您的情况下,不需要特殊的魔法来解决这个问题。基本上,您需要一个允许只运行一次方法的结构

此结构的输入是模块列表。检查模块是否已加载的缓存是对象。考虑下面的模块名称列表和一个空对象:

Template.yourTemplate.onCreatedfunction{ const instance=this; instance.state=新的ReactiveDict; state.set'modules',['a','b','c']; set'loaded',{}; }; 您可以加载模块,然后向已加载模块的对象添加条目:

//模板函数之外 函数LoadOnMemodule,templateInstance{ const loaded=templateInstance.state.get'loaded'; //如果已加载,则返回 如果加载[模块]返回; //else加载模块并设置为已加载 Session.setAssessment\u名称、模块名称 加载的[模块]=真; state.set'loaded',loaded; } Template.yourTemplate.events{ 更改模块选择:functionevent,template{ 变量模块名称=$event.currentTarget.val loadOncemodule_名称、模板; } }; 现在只需加载一次就可以解决问题,但可能无法解决问题,因为您的选择列表仍然包含要选择的元素

因此,如果要删除选项中的元素,还可以从模块数组中删除该元素。那么它就不再是可选择的了

函数LoadOnMemodule,templateInstance{ const loaded=templateInstance.state.get'loaded'; const modules=templateInstance.state.get'modules'; //如果已加载,则返回 如果加载[模块]返回; //else加载模块并设置为已加载 Session.setAssessment\u名称、模块名称 加载的[模块]=真; modules.拼接modules.indexOfmodule,1; state.set'loaded',loaded; state.set'modules',modules; }
关于安全性的一般注意事项:如果客户端想要加载模块,这不会阻止客户端加载模块。这只是UI/UX功能,但如果需要,不会阻止某人加载模块。

如果不想将会话变量“Assessment\u name”设置为相同的值两次,我认为这是为了避免此设置的其他副作用。因此,我假设您只想在变量当前值的情况下防止再次设置,因此如果会话变量设置为下拉列表中另一项的值,您不会介意它是否更改,即使它更改为的项在过去某个时间被选中。因此,如果这些假设是正确的,那么只需检查会话变量的值就足以防止设置相同的值:

"change #module-select": function(event, template){
     var module_name = $(event.currentTarget).val()
     console.log("assessment: ", module_name)
     if (Session.get("Assessment_name") !== module_name) {
       Session.set("Assessment_name", module_name)
     }
   }
"change #module-select": function(event, template){
     var module_name = $(event.currentTarget).val()
     console.log("assessment: ", module_name)
     if (Session.get("Assessment_name") !== module_name) {
       Session.set("Assessment_name", module_name)
     }
   }