javascript - 在父级上设置操作时,复选框样式未正确切换,更新的数据从父级发送到子级
问题描述
我有一个带有复选框的卡片组件,检查状态从父级传递到该组件。复选框被隐藏,标签的样式看起来像一个复选框。包含复选框的整张卡片都有动作处理程序。当我直接单击复选框标签或卡片时,它会正确切换,但是在使用 Space 时,动作会正确触发,但复选框不会切换。我看到在 DOM 中未为隐藏复选框设置选中的属性,因此未呈现选中复选框的样式。我试图检查卡组件上的计算属性以在更新检查值时强制重新渲染,但没有运气。
<!-- parent -->
{{#each userList as |user|}}
<li {{action "selectCard" user}}>
{{member-card
name=user.name
checkboxId=user.checkboxId
checked=user.checked
}}
</li>
<!-- child -->
<div>
<input
type="checkbox"
id={{checkboxId}}
checked={{checked}}
/>
<label for={{checkboxId}} class="result-card__name-label">
{{name}}
</label>
</div>
在检查时,我发现检查的 DOM 属性设置不正确。当我尝试时:
<!-- child -->
{{#if checked}}
<input
type="checkbox"
id={{checkboxId}}
checked
/>
{{else}}
<input
type="checkbox"
id={{checkboxId}} />
{{/if}}
这似乎给出了我想要的结果。一种可行的解决方案是,如果我也在复选框标签上设置相同的操作处理程序,并防止事件在单击时冒泡。但这似乎不是一个优雅的解决方案。想了解为什么复选框没有正确重新渲染。
我想,因为当我点击卡片时,checked 属性会更新(我使用 ember 检查器验证了这一点)我会假设checked 属性将在复选框上被选中。但由于某种原因,这不是它的工作方式。我结束了,但在标签上使用了 prevent default 来阻止事件从它传播到复选框,以阻止它再次触发事件。
灰烬版本:3.8
解决方案
你所展示的,应该有效。这是一个 Twiddle 演示它:https ://ember-twiddle.com/0631193dc09a3646ca9e9a1efe351607?numColumns=2&openFiles=controllers.application.js%2Ctemplates.application.hbs
您的问题可能出在其他地方。
你如何设置对象的checked
属性user
?是user
实例EmberObject
还是 POJO?
如果它是 POJO 并且您正在执行user.checked = true
,则模板不会更新。Ember 无法知道属性已更改。
使其成为一个实例EmberObject
并用于user.set()
设置它。
或者,如果您使用的是 Ember Octane(推荐),user
可以是一个简单类的实例,并且您可以在类属性上使用@tracked
装饰器。checked
然后您可以使用user.checked = true
来更改复选框状态。
推荐阅读
- javascript - 如何在 Echarts 中描述平滑曲线和锐角图?
- amazon-web-services - 无法创建红移连接
- css - 不变违规:提供给“样式表生成”预期“数字”的“字符串”类型的无效道具“字体大小” - 样式组件 RN
- angular - 带有 Angular 的 Highcharts
- algorithm - 哪种密码排列方法更安全?
- jquery - 如何在 UI 上显示 celery 进度条,即使在切换页面后它也应该显示
- class - 是否可以将一个类的代码分发到多个文件?
- database - 如何以 oracle home 用户身份登录 oracleDB?
- python - 我在哪里可以获得 Werkzeug 的 send_file 的“环境”参数?
- java - 如何以编程方式折叠android中的通知面板