Knockout.js 向使用knockout.mapping插件和knockoutjs创建的嵌套可观察数组添加新值

Knockout.js 向使用knockout.mapping插件和knockoutjs创建的嵌套可观察数组添加新值,knockout.js,knockout-mapping-plugin,Knockout.js,Knockout Mapping Plugin,如此接近于让它如预期的那样工作。我从一个JSON请求中获取数据,然后使用映射插件对其进行映射。我想向单击绑定上的嵌套数组添加新值 现在在我的代码中,我得到一个错误,没有定义addPoint 视图: JSON: [{type:“spline”,“marker:{”symbol:“diamond”},“name:“累计”,“data:[10,17,18,18,16,17,18,19]},{”type:“spline”,“marker:{”symbol:“circle”},“name:“Monthly

如此接近于让它如预期的那样工作。我从一个JSON请求中获取数据,然后使用映射插件对其进行映射。我想向单击绑定上的嵌套数组添加新值

现在在我的代码中,我得到一个错误,没有定义addPoint

视图:

JSON:

[{type:“spline”,“marker:{”symbol:“diamond”},“name:“累计”,“data:[10,17,18,18,16,17,18,19]},{”type:“spline”,“marker:{”symbol:“circle”},“name:“Monthly”,“data:[10,22,20,19,8,20,25,23]}

我能够根据先前的响应调整这个JSFIDLE,以便向单个数组添加点。我需要找到一种方法在生成的映射中实现这一点

出现“addPoint未定义”错误的原因是您位于视图模型子属性的模板内。在模板内部,绑定上下文是stat对象,而不是视图模型

一句话:Knockout正在寻找一个stat.addPoint函数,它不存在,所以您会得到错误

您可能要做的是引用父绑定上下文,即视图模型。在KO 1.3测试版中,您可以这样:

<button data-bind="click: $.parent.addPoint">Add Point</button>
添加点

如果您使用的是旧版本的Knockout,它不提供对父绑定上下文的访问,请告诉我,还有一些附加选项,例如使视图模型全局可访问,然后只绑定到该完全限定名称。

在绑定到
addPoint
的位置,上下文是
stats
中的一个项,而不是视图模型

如果
viewModel
具有全局范围,则可以执行以下操作:
单击:viewModel.addPoint
。您需要确保在
addPoint
方法中正确设置了
。最简单的方法是将该方法绑定到viewModel变量,如:

viewModel.addPoint = function() {
    this.stats.data.push(new mappedData(0));
}.bind(viewModel);
如果
viewModel
没有全局作用域,则可以通过将其传入。这就像:

<tbody data-bind='template: {name: "statRowTemplate", 
                             foreach: stats, templateOptions: { add: addPoints } }'></tbody>

然后,像这样称呼它:
addpoint


最后,如果您正在使用,然后你可以这样做:
addPoint

我已经尝试了两种方法,我得到了错误
uncaughttypeerror:cannotcallmethod'push'of undefined
我之所以在stats模板中放置这个按钮,是因为我希望能够独立地向每个数组添加新项。好的-你真的需要addPoint方法吗处理统计数据中的特定项目。您可以为
stats
添加映射,并在那里添加addPoint方法,或者让viewModel上的addPoint将stat作为第一个参数。然后,执行:
data bind=“click:function(){viewModel.addPoint($data);}
$data
将是stats中的一个特定项,您可以推送到它的数据。
viewModel.addPoint = function() {
    this.stats.data.push(new mappedData(0));
}.bind(viewModel);
<tbody data-bind='template: {name: "statRowTemplate", 
                             foreach: stats, templateOptions: { add: addPoints } }'></tbody>