如何将observableArray传递至模板?无需修改JS是否可行?
如何在Knockout模板中传递ObservableArray本身(无需修改JS代码)
首先要澄清一个关键点:你已经成功把ObservableArray传递到模板里了!只是你用JSON.stringify($data)看不到它,因为Knockout的Observable本质是一个函数,而JSON默认会忽略对象中的函数类型属性,所以才只显示了isWarning: false。
要验证ObservableArray确实存在且可正常使用,你可以修改模板,用Knockout的绑定语法直接操作它,比如:
<template id="my-template"> <!-- 验证Observable是否存在 --> <div>Errors是Observable函数:<span data-bind="text: typeof errors === 'function'"></span></div> <!-- 获取当前数组长度(调用Observable) --> <div>错误数量:<span data-bind="text: errors().length"></span></div> <!-- 遍历ObservableArray --> <ul data-bind="foreach: errors"> <li data-bind="text: $data"></li> </ul> <!-- 如果你想序列化显示数组内容,可以手动解开Observable --> <pre data-bind="text: JSON.stringify({ isWarning: isWarning, errors: errors() })"></pre> </template> <div data-bind="template: { name: 'my-template', data: { errors: myObservableArray, isWarning: false }}"></div>
为什么原来的JSON.stringify看不到Errors?
Knockout的Observable(包括ObservableArray)是封装过的函数,带有内部的订阅机制和状态管理。当你用JSON.stringify序列化对象时,它只会遍历对象的可枚举自有属性,而Observable函数本身的可枚举属性极少,所以不会被JSON序列化器识别并输出——但这完全不影响你在模板中通过Knockout的绑定语法使用这个ObservableArray。
总结
不需要修改任何JS代码,你只需要:
- 保持模板绑定中
data: { errors: myObservableArray, isWarning: false }的写法(不要加()) - 在模板中通过Knockout的绑定语法直接使用
errors这个Observable(比如errors()获取数组,foreach: errors遍历,或者调用它的Observable方法如errors.push(...))
内容的提问来源于stack exchange,提问作者Liero
相关产品推荐
相关产品推荐

