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