javascript - 淘汰赛:在列表中的对象上实现“聚焦”
问题描述
在我的根视图模型中,我有可观察的objects
.
我想要一个下拉列表,允许用户选择该列表的元素(让我们称之为current
),然后能够将一些property
选定的对象绑定到某个编辑框。
因此,对于用户来说,这应该看起来像是他\她可以“关注”某个特定对象(使用组合框),然后编辑它的属性。
现在在我的html中我有这样的东西:
<select data-bind="options: objects, optionsText: 'property', value: current, optionsCaption: 'Choose...'"></select>
... 对于下拉列表,并且:
<input data-bind="value: current.property"/>
...对于应该编辑的属性。
同时,在 js 中我做了这样的事情:
function ObjectViewModel(p) {
var self = this;
self.property = ko.observable(p);
}
function AppViewModel() {
var self = this;
self.objects = ko.observableArray([
new ObjectViewModel("id1"),
new ObjectViewModel("id2")
]);
self.current = ko.observable();
}
ko.applyBindings(new AppViewModel());
但是,当我在下拉列表中选择值时,什么也没有发生。
我怀疑我没有正确管理current
财产AppViewModel
。
在淘汰赛中实现这一点的正确方法是什么?
解决方案
您的代码有 2 个问题:
- 当前是可观察的,因此要评估值,您必须使用“()”。
- 除非设置了 current,否则“current().property”将无法访问。所以为了避免失败,请检查一下。希望这会有所帮助。
function ObjectViewModel(p) {
var self = this;
self.property = ko.observable(p);
}
function AppViewModel() {
var self = this;
self.objects = ko.observableArray([
new ObjectViewModel("id1"),
new ObjectViewModel("id2")
]);
self.current = ko.observable();
}
ko.applyBindings(new AppViewModel());
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.2/knockout-min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<select data-bind="options: objects, optionsText: 'property', value: current, optionsCaption: 'Choose...'"></select>
<!-- ko if:current() -->
<h2 data-bind="text:current().property"></h2>
<input data-bind="value:current().property"/>
<!-- /ko -->
推荐阅读
- reactjs - ThemeProvider 不会改变组件的主题,React
- php - WordPress 从帖子 ID 重定向到另一个帖子 ID
- java - 将时间段拆分为每小时间隔
- angular - 在 Angular 9 中使用 hhtp 发布请求
- python - 如何使用 pyppeteer/puppeteer 单击动态生成的按钮?
- ios - Post Data Not Working // 访问闭包之外的数据 // Swift Firebase
- sbt - sbt 1.3.8 显示很多无用的消息
- angular - 从 8 升级到 9 ng 构建错误后:在编译 angular/core 时导入意外符号 invalidFactory
- java - 如何在没有库的情况下使快速排序代码稳定?(爪哇)
- php - 如何设置 php number_format 以显示小数点到 40 位