在jsViews下拉列表选择复杂对象后如何获取其额外属性?
在JsViews中获取下拉选中项的额外属性
嘿,我明白你的需求了——你已经把包含额外属性(比如icon)的对象数组绑定到了下拉组件,但目前只能拿到value,想获取其他属性对吧?在JsViews里有两种很直观的方式解决这个问题,我结合你的代码给你详细说说:
方案1:直接绑定整个选中对象(推荐)
这种方式最直接,让下拉组件绑定到完整的对象,而不是单独的value字段,这样选中后你就能直接访问该对象的所有属性了。
修改你的数据模型和绑定代码:
(function($) { var dataVm = { selectedItem: null, // 改成绑定整个对象,而非单独的value choices: [ { "label" : "France", "value" : "FR", "icon" : "flag-icon-fr" }, { "label" : "Germany", "value" : "DE", "icon" : "flag-icon-de" }, // 其他选项... ] }; // 绑定到页面容器 $.templates("#selectTemplate").link("#container", dataVm); })(jQuery);
对应的模板可以用JsViews的select标签,明确指定标签和值对应的属性:
<script id="selectTemplate" type="text/x-jsrender"> {^{select selectedItem choices labelProp="label" valueProp="value" emptyText="Select a country..." }} <!-- 实时渲染选中项的额外属性 --> {^{if selectedItem}} <div class="selected-info"> <span class="flag-icon {{:selectedItem.icon}}"></span> <span>Selected: {{:selectedItem.label}}</span> </div> {{/if}} </script> <div id="container"></div>
现在用户选择选项后,dataVm.selectedItem就是完整的对象,你可以直接用dataVm.selectedItem.icon拿到图标类名,模板里也能实时渲染这些额外属性。
方案2:保留现有value绑定,通过计算属性获取完整对象
如果你不想改动现有的value绑定逻辑,也可以给数据模型添加一个计算属性,自动根据当前的value匹配对应的选项对象:
修改你的数据模型:
(function($) { var dataVm = { value: null, // 保留原来的value绑定 choices: [ { "label" : "France", "value" : "FR", "icon" : "flag-icon-fr" }, { "label" : "Germany", "value" : "DE", "icon" : "flag-icon-de" }, // 其他选项... ] }; // 添加计算属性,依赖value和choices的变化自动更新 dataVm.selectedChoice = $.observable.computed(function() { // 从choices数组中匹配当前value对应的对象 return this.choices.find(choice => choice.value === this.value); }, { dependsOn: ["value", "choices"], owner: dataVm }); // 绑定到页面容器 $.templates("#selectTemplate").link("#container", dataVm); })(jQuery);
现在只要dataVm.value变化,dataVm.selectedChoice就会自动更新为对应的完整对象,你可以这样访问额外属性:
// 获取选中的图标类名 var selectedIcon = dataVm.selectedChoice?.icon;
模板里也能直接使用这个计算属性:
<script id="selectTemplate" type="text/x-jsrender"> <select data-link="value"></select> {^{if selectedChoice}} <p>Selected icon class: {{:selectedChoice.icon}}</p> {{/if}} </script>
两种方案都能解决你的问题,方案1更简洁直接,推荐优先使用;方案2适合需要保留原有value绑定逻辑的场景。
内容的提问来源于stack exchange,提问作者Steve B
相关产品推荐
相关产品推荐

