使用knockout.js的动态可观测量
Dynamic amount of observables with knockout.js
我有一个关于knockout.js库的基本问题。
到目前为止,我正在创建一些类型为number和range的输入字段。
<input type="range" min="0.0" max="1.0" step="0.001" data-bind="value: example1" ></input>
<input type="number" min="0.0" max="1.0" step="0.001" data-bind="value: example1"></input>
<input type="range" min="0.5" max="2.5" step="0.001" data-bind="value: example2" ></input>
<input type="number" min="0.5" max="2.5" step="0.001" data-bind="value: example2"></input>
当激活knockout.js时,我只是在做一些类似的事情
this.example1 = ko.observable("0.000");
this.example2 = ko.observable("0.000");
我的问题是,网站接收到这些输入参数的随机数量。对于一些项目,只有2个类似于我的示例,而其他项目则有8个参数。
如何在淘汰赛中指定这些可观测量的动态量?
谢谢!
编辑:
已解决。
继续选择答案的解决方案:
通过"attr"绑定,我可以为每个输入设置不同的属性值。
<input type="number" step="0.001" data-bind="value: value, attr: {id: name, min: minValue, max: maxValue}"></input>
只需使用一个可观测的可观测数组。创建一个可观察数组,并为server.push()返回的每个结果在可观察数组中添加一个新的可观察对象或具有可观察对象的对象。
然后在Dom中使用for-each绑定对它们进行迭代并显示每个绑定。
在VM-中
var objectsArray = ko.observableArray();
// results from AJAX or w/e
ko.utils.arrayForEach(results, function (result) {
objectsArray.push(new ObjectType(result));
});
function ObjectType (data) {
var self = this;
self.SomeProperty = ko.observable(data);
}
然后在视图中
<div data-bind="foreach: objectsArray">
<input data-bind="value: SomeProperty " />
</div>
jsFiddle示例-
http://jsfiddle.net/zabpe3jm/
一方面,JavaScript使在需要时向对象添加属性变得非常容易,因此创建一个准确反映数据的视图模型并不困难。
另一方面,棘手的部分是使用具有data-bind
属性的HTML,这将准确地反映动态视图模型。
一个可能的解决方案是将视图模型重构为两个:
function viewModelContainer(arrData) {
var self = this;
// this holds a dynamic number of elements, depending upon the data from the server
self.Observables = ko.observableArray([]);
// using an IIFE as a type of constructor for getting the
// `arrData` param into your observable
(function(arrData) {
// add all elements in a single call so that you don't cause
// multiple unnecessary updates to the UI
var arr = [];
for (var i = 0, iMax == arrData.length; i < iMax; i++) {
arr.push(new viewModelData(arrData[i]));
}
self.Observables.push(arr);
}(arrData));
}
function viewModelData(data) {
var self = this;
self.Data = ko.observable(data);
}
因此,现在您有了一个单独的对象/视图模型(viewModelContainer
的实例),知道它包含多少值。
下一步是在HTML:中枚举这些(使用Knockout)
<!-- ko foreach: Observables -->
<input type="range" min="0.0" max="1.0" step="0.001" data-bind="value: Data" ></input>
<input type="number" min="0.0" max="1.0" step="0.001" data-bind="value: Data"></input>
<!-- /ko -->
我已经根据记忆写下了自由手/,所以你可能需要润色一下,但我希望你能领会要点。
我认为您不想使用observable
,而是使用observableArray
代替
this.yourObjects = ko.observableArray([]);
然后,假设您有一个包含输入参数的源数组,您只需将它们添加到数组中:
for (var i in sourceArray) {
this.yourObjects.push(sourceArray[i]);
}
要渲染它,只需使用foreach绑定:
<div data-bind="foreach: yourObjects">
<input type="range" min="0.0" max="1.0" step="0.001" data-bind="value: $data" ></input>
</div>
请注意,您使用"value:$data"是因为您不想要项目的某些属性,而是想要项目本身(如您的数值)
- Potree/Three.js测量问题
- 如何解析和捕获任何测量单位
- Regex用于手上测量
- 测量输入时间
- 有没有更好的方法可以测量从Ajax调用返回数据所需的总时间
- 在Chrome开发工具中测量步骤之间的时间
- 正在测量全局命名空间的污染
- 测量渲染时间
- 在javascript中测量websockets数据输入/输出的大小
- 自治领土地测量员的正则表达式
- HTTP使用拦截器测量每个请求的时间
- 如何测量Javascript对象的大小
- 如何在JavaScript中测量交互和mousedown事件之间的延迟
- 核心动画页面中的聚合物内容标签不会;t测量高度
- HTML5(测量页面加载时间)
- 使用node.js http代理测量流量
- 如何在safari中测量tel://link的呼叫时间
- 测量JavaScript函数的内存使用情况、执行时间和性能
- KnockoutJS-依赖的可观测量或计算的可观测值
- 使用knockout.js的动态可观测量