【问题标题】:How to access grandchild viewmodel from parent viewmodel?如何从父视图模型访问孙视图模型?
【发布时间】:2014-09-04 09:31:09
【问题描述】:

在我的 web 应用程序中,我正在创建三个嵌套的视图模型,例如第一个视图模型是第二个的父级,第二个是第三个的父级。现在如果我想显示第三个视图模型的值,它会给我错误,它没有定义。在我的代码中,LoanRateViewModel 是父母,其孩子是 TermTierTerm 的孩子。

function Tier(data){
    var self = this;
    self.tierValue = ko.observable(data.tierValue || "");
    self.rate = ko.observable(data.rate || "121212");
    self.simplerate = ko.observable(data.simplerate || "121212");
    self.compoundrate = ko.observable(data.compoundrate || "12212");
    } 

function Term(data) {
    var self = this;
    self.Tiers = ko.observableArray([]);
    self.loanterm = ko.observable(data.loanterm || "12");
    self.termIdentifier = ko.observable(data.termIdentifier || "12");
};

这里是 jsfiddle 链接DEMO

通过knockout js可以叫孙子吗?

【问题讨论】:

  • 你不能这样跳过关卡——你怎么知道要显示哪个孙子?你必须知道它的父母。所以尝试使用类似:LoanRateViewModel.Terms()[i].Tiers() 其中iTier's 父级的索引。
  • 您可以使用计算来通过枚举所有术语来构建所有层的数组。即使你这样做了,<a data-bind="click: addTier">Add Fields</a> 也有问题。您的级别是哪个学期?
  • 如果通过 ui 调用访问它,您可以传入事件并使用 ko.contextFor(element) 并且在该模型中您可以访问其父级等等。

标签: javascript knockout.js knockout-3.0


【解决方案1】:

不幸的是,问题不在于您发布的代码*,而在于小提琴。

您想要的当然是可能的,尽管如 cmets 中所述,您需要适当的嵌套才能接触到孙辈,因为他们总是在某个父辈的上下文中 (Term)。 I've (mostly) fixed your jsfiddle,修复问题,直到没有错误为止。可以回答您的“问题”的一些事情是:

  • 确保正确关闭 DOM 元素(例如 tabletbody);
  • 确保您参考 $root 获取根目录上的方法(例如 addTier);
  • 在表格中,确保每一行的单元格数量相等(或使用colspan),否则您的结果会看起来很奇怪。

* 如果您编辑您的问题并包含相关(最好是格式正确的)代码,那就太好了,这样该问题对于其他有类似问题的人仍然有用。

【讨论】:

    猜你喜欢
    • 2018-06-24
    • 1970-01-01
    • 2013-02-25
    • 2017-05-04
    • 1970-01-01
    • 2014-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多