Knockout.js 剑道淘汰:对网格源数据应用绑定时出现最大调用堆栈大小错误

Knockout.js 剑道淘汰:对网格源数据应用绑定时出现最大调用堆栈大小错误,knockout.js,kendo-ui,Knockout.js,Kendo Ui,我正在使用RPNiemeyer剑道淘汰库。我有三个视图模型彼此实例化-LanguageDetailsViewModel实例化LanguageListViewModel,它实例化LanguageDetailsViewModel。最后一个viewmodelLanguageDetailsViewModel需要引用父视图,因为其功能依赖于父视图 html: 当网格绑定到源数据时,对父视图模型的引用会导致某种不定循环。我收到超过最大调用堆栈大小的错误。我相信绑定到网格源时,剑道击出库中会出现错误,因为如果

我正在使用RPNiemeyer剑道淘汰库。我有三个视图模型彼此实例化-
LanguageDetailsViewModel
实例化
LanguageListViewModel
,它实例化
LanguageDetailsViewModel
。最后一个viewmodel
LanguageDetailsViewModel
需要引用父视图,因为其功能依赖于父视图

html:

当网格绑定到源数据时,对父视图模型的引用会导致某种不定循环。我收到超过最大调用堆栈大小的
错误。我相信绑定到网格源时,剑道击出库中会出现错误,因为如果我删除网格,那么在这一行上,击出绑定到div时不会出现错误:

ko.applyBindings(parentViewModel, element);
这是导致此错误的真正原因吗?我如何修复此错误?我无法删除对父视图模型的引用,因此我希望修复绑定到源数据时的剑道淘汰行为。如果您有任何关于工作示例的帮助,我们将不胜感激。谢谢

根据Niemeyer的评论更新:

我有一个div,其中一些属性绑定到
特许详细信息viewmodel
。其中一个属性表示一个复选框-将其命名为
isVisible
。我有另一个div,其属性绑定到
LanguageDetailsViewModel
。只有选中了
特许详细信息viewmodel
的复选框,这些属性中的一些才可见。这就是特许经营权。isVisible是真的。这就是我需要特许经营参考的原因

我对javascript比较陌生,可能没有正确使用prototype属性。当我使用
new
关键字实例化viewmodels时,我发现当将其分配给原型时,它们会成为公共的,并且在标记中可见,因此我可以绑定它们。从您的示例中,我看到this.myProperty也将该属性公开。我不确定我的情况是否有所不同


我决定使用
this.myData.parent=parent作为我问题的解决方案。非常感谢您的反馈。

基于以上评论:

一种选择是“隐藏”特许经营权,这样Knockout就不会递归地试图打开它。您可以通过使其成为函数或可观察(即函数)的属性来实现这一点

有几种方法可以做到这一点:

var Child = function(parent) {

    //use parent directly from the argument passed to the constructor. available as part of the closure.
    this.myHandler = function() {
        parent.log();
    };        

    this.myData = ko.observable();

    //reference as a sub-observable. you can bind against myData.parent, but it will disappear when doing ko.toJS/ko.toJSON
    this.myData.parent = parent;


    //similar to sub-observable.  hide the actual value behind an empty function.  It will not be found when doing ko.toJS/ko.toJSON.
    this.parent = function() { };
    this.parent.value = parent;  
};
这里的示例:jsfiddle.net/rniemeyer/uSpZB


通常情况下,您不希望在原型上放置可观察对象,因为它们将被所有实例共享。

在最低视图模型上,您最终需要如何处理
特许权
?如果您只需要在处理程序中引用它,那么您可以直接在处理程序中使用参数
特许权
。否则,您可以通过使其成为函数或可观察(这是函数)的属性来“隐藏”特许权。此处的说明:。我不确定我是否也了解您在这些模型中使用的原型。您是否正在创建希望在实例之间共享的可观察对象?谢谢您的回答。我更新了我的帖子,更新了你的通讯网。请发布您的解决方案,以便我可以接受。谢谢
ko.applyBindings(parentViewModel, element);
var Child = function(parent) {

    //use parent directly from the argument passed to the constructor. available as part of the closure.
    this.myHandler = function() {
        parent.log();
    };        

    this.myData = ko.observable();

    //reference as a sub-observable. you can bind against myData.parent, but it will disappear when doing ko.toJS/ko.toJSON
    this.myData.parent = parent;


    //similar to sub-observable.  hide the actual value behind an empty function.  It will not be found when doing ko.toJS/ko.toJSON.
    this.parent = function() { };
    this.parent.value = parent;  
};