删除:动态地复制/克隆一个表单以获得额外的数据输入
Knockout: Dynamically duplicating / cloning a form for additional data entry
noob alert.
我刚刚开始与淘汰赛,我有一个表单做我想要的,但我需要能够动态复制的形式,以便一组新的值可以输入&第二组结果将显示在现有数据的下面(在hr下面)。
所以基本上我需要用户能够点击一个按钮,添加另一个表单,不干扰现有的表单。然后根据需要添加更多的表单(具体来说,最多5个),所有的数据集都显示在彼此的下方。
为代码块感到抱歉,但我不确定我可以安全地删除什么。我在http://jsfiddle.net/GEKst/1/创建了一个小提琴。
任何提示都非常感谢。
<body>
<!-- This is a *view* - HTML markup that defines the appearance of your UI -->
<p>Sample rate (Hz):
<select data-bind="options: sampleRate, value: selectedSampleRate"></select>
</p>
<p>MCLK frequency:
<select data-bind="options: mclk, value: selectedMclk"></select>
</p>
<p>TDM channels per line:
<select data-bind="options: tdmChans, value: selectedTdmchan"></select>
</p>
<hr/>
<!-- render the json -->
<p class="code"><sample_rate><span data-bind="text: selectedSampleRate"></span></sample_rate>
<br/><mclk><span data-bind="text: selectedMclk"></span></mclk>
<br/><tdm_chan><span data-bind="text: selectedTdmchan"></span></tdm_chan>
</p>
</body>
Js:
window.onload = startKnockout;
function AppViewModel() {
var self = this;
<!-- declare observables -->
self.selectedSampleRate = ko.observable();
self.selectedMclk = ko.observable();
self.selectedTdmchan = ko.observable();
// Define controls
self.sampleRate = ko.observableArray(['192000', '176400', '96000', '88200', '48000', '44100'])
self.mclk = ko.observableArray(['AUDIO_MCLK_49M', 'AUDIO_MCLK_24M', 'AUDIO_MCLK_12M', 'AUDIO_MCLK_6M', 'AUDIO_MCLK_3M'])
self.tdmChans = ko.computed(function () {
if (self.selectedSampleRate() == 44100 || self.selectedSampleRate() == 48000) {
return ['2', '4', '8', '16'];
} else if (self.selectedSampleRate() == 88200 || self.selectedSampleRate() == 96000) {
return ['2', '4', '8'];
} else if (self.selectedSampleRate() == 176400 || self.selectedSampleRate() == 192000) {
return ['2', '4'];
} else {
// do nothing
}
}, self);
}
// Activates knockout.js
function startKnockout() {
ko.applyBindings(new AppViewModel());
};
将表单抽象到一个单独的视图模型中:
function FormViewModel() {
var self = this;
self.selectedSampleRate = ko.observable();
self.selectedMclk = ko.observable();
self.selectedTdmchan = ko.observable();
self.sampleRate = ko.observableArray[/* ... */])
self.mclk = ko.observableArray([/* ... */])
self.tdmChans = ko.computed(function () { /* ... */ }, self);
}
…让你的AppViewModel拥有其中的几个:
function AppViewModel() {
var self = this;
self.forms = ko.observableArray([]);
self.addForm = function () {
self.forms.push(new FormViewModel());
};
self.canAddForm = ko.computed(function () {
return self.forms().length < 5;
});
}
并在视图中使用foreach
绑定:
<body>
<ul class="list-of-forms" data-bind="foreach: forms">
<li>
<!-- your individual form definition here -->
</ul>
</ul>
<button data-bind="click: addForm, enable: canAddForm">Add Form</button>
</body>
我相信你会自己找到剩下的(比如如何制作一个"删除表单"按钮)。
您基本上需要将AppViewModel分解为单独的区域。第一部分将是表单本身,目前您所需要的只是用于保存所选值的字段。所以你就有了这个表单
function Form() {
var self = this;
self.selectedSampleRate = ko.observable();
self.selectedMclk = ko.observable();
self.selectedTdmchan = ko.observable();
// Define controls
self.tdmChans = ko.computed(function () {
if (self.selectedSampleRate() == 44100 || self.selectedSampleRate() == 48000) {
return ['2', '4', '8', '16'];
} else if (self.selectedSampleRate() == 88200 || self.selectedSampleRate() == 96000) {
return ['2', '4', '8'];
} else if (self.selectedSampleRate() == 176400 || self.selectedSampleRate() == 192000) {
return ['2', '4'];
} else {
// do nothing
}
}, self);
return self;
}
那么你的ViewModel将包含一对可观察数组。一个用于采样率,一个用于Mclk,另一个用于包含已填写的表单。
var Vm = function () {
var self = this;
self.forms = ko.observableArray([]);
self.addForm = function () {
self.forms.push(new Form());
};
self.sampleRate = ko.observableArray(['192000', '176400', '96000', '88200', '48000', '44100']);
self.mclk = ko.observableArray(['AUDIO_MCLK_49M', 'AUDIO_MCLK_24M', 'AUDIO_MCLK_12M', 'AUDIO_MCLK_6M', 'AUDIO_MCLK_3M']);
return self;
}
您还需要添加一个方法来将新表单添加到ViewModel的数组中。
jsFiddle演示
相关文章:
- 后焦点更改为IE 11中的地址栏,而不是转移到表单中的下一个控件
- 使用ajax将数据从一个步骤发送到下一个步骤的3步表单
- jquery mobile上多个页面上的一个表单
- 如何在只能有一个asp.net表单的主页上从asp.net页面中的javascript中获取值
- 如何创建一个“;表单弹出框“;在chrome中右键单击时位于突出显示的单词上方
- 循环遍历包含另一个表单的表单
- jquery从2个json字符串构建一个复选框表单
- 为网站表单创建一个专业的日历
- 如何在javascript转换编码中将一个动态值从一个表单添加到另一个页面
- 我确实有一个表单,如果用户输入了输入,它应该检查否定或空的输入框,并抛出一条警告消息
- 在表单中创建一个黑名单过滤器以避免某些单词
- 从一个iframe到另一个ifame的过帐表单-IE
- 从表单中动态生成一个字符串,传递给通过AJAX加载的PHP文件
- 页面上的2个表单带有JS验证-其中一个抛出电子邮件验证错误
- 需要一个用于AJAX的Javascript库,其中包含多部分/表单数据
- 当阻止Enter键提交AJAX表单时,关注下一个输入是't工作
- 一个具有两个图像按钮的表单在只能按下一个按钮的情况下发送两个按钮值
- 在另一个可观察量完成后触发第二个表单提交单击
- 两个表单 - 一个提交按钮
- 多表单一个ajax函数