$root 和 $parent 有什么区别?

2024-04-03

我正在学习 KnockoutJS,但我不明白两者之间的区别$root and $parent用法。请参见这个jsfiddle http://jsfiddle.net/supercool/2gt4K/27/,或下面的代码:

<div data-bind="foreach:mainloop">
    $data Value: <span data-bind="text:$data.firstName"></span> 
                  <span data-bind="text:$data.lastName"></span> --(1)

    <br/>
    $parent Value: <span data-bind="text:firstName"> </span> 
                   <span data-bind="text:$parent.lastName"></span>
    <br/>
    $root Value: <span data-bind="text:firstName"></span>
                 <span data-bind="text:$root.lastName"></span>
    <br/>
        <hr/>
</div>
var mainLoopModel = function () {
    var self = this; // Root Level scope
    self.mainloop = ko.observableArray([{
        'firstName': 'jhon'
    }, {
        'firstName': 'sam'
    }]);
    self.lastName = ko.observable('peters');
    /*if you remove $data before lastName in note (1) you get undefined error because because mainloop dont have lastName root model has lastName so you have to access using parent or higher level */
}

ko.applyBindings(new mainLoopModel());

在上面的代码中$root and $parent两者都用于相同的目的:引用外部作用域变量。我只是想知道两者之间有什么区别吗$root and $parent用途?如果是,请通过一个正确使用的好例子帮助我理解。


它们相似但又不同:

  • $root指的是应用于 DOM 的视图模型ko.applyBindings;
  • $parent指直接外部范围;

或者,从视觉上看,$data的观点:

或者,用一句话来说相关文件 http://knockoutjs.com/documentation/binding-context.html:

  • $parent:这是父上下文中的视图模型对象,即紧邻当前上下文之外的视图模型对象。

  • $root:这是根上下文(即最顶层父上下文)中的主视图模型对象。通常是传递给的对象ko.applyBindings。它相当于$parents[$parents.length - 1].

  • $data:这是当前上下文中的视图模型对象。在根上下文中,$data 和 $root 是等效的。

只有当您的视图模型嵌套超过一层时,您才会看到实际的差异,否则它们将等同于同一件事。

它的好处很容易证明:

var Person = function(name) {
  var self = this;
  self.name = ko.observable(name);
  self.children = ko.observableArray([]);
}
  
var ViewModel = function() {
  var self = this;
  self.name = 'root view model';
  self.mainPerson = ko.observable();
}

var vm = new ViewModel(),
    grandpa = new Person('grandpa'),
    daddy = new Person('daddy'),
    son1 = new Person('marc'),
    son2 = new Person('john');

vm.mainPerson(grandpa);
grandpa.children.push(daddy);
daddy.children.push(son1);
daddy.children.push(son2);

ko.applyBindings(vm);
th, td { padding: 10px; border: 1px solid gray; }
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script>

<script type="text/html" id="person">
  <tr>
    <td data-bind="text: $root.name"></td>
    <td data-bind="text: $parent.name"></td>
    <td data-bind="text: $data.name"></td>
  </tr>
  <!-- ko template: { name: 'person', foreach: children } --><!-- /ko -->
</script>

<table>
  <tr>
    <th>$root</th>
    <th>$parent</th>
    <th>$data</th>
  </tr>
  <!-- ko template: { name: 'person', data: mainPerson } --><!-- /ko -->
</table>

The $root总是一样的。这$parent是不同的,取决于你嵌套的深度。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

$root 和 $parent 有什么区别? 的相关文章

  • 根据控制器响应动态更改视图部分

    我正在寻找以下场景的最佳方法建议 用户可以选择一个或多个 csv 文件进行验证 附件 1 单击 验证 按钮会执行验证代码 显示进度条 直到返回输出 返回响应可以是成功消息 也可以是选择验证的每个文件的错误详细信息 附件 2 现在可以使用 上
  • Knockout 无法处理绑定

    当文本未定义时如何绑定文本 例如名称不可用 table class table thead tr th class col md 4 ID th th class col md 4 Name th tr thead tbody tr td
  • 使用 Knockout 将任何键(通过键码)绑定到操作

    我正在寻找一种方法将许多不同的键绑定到我的视图模型中的不同操作 功能 我找到了这个example http geekswithblogs net michelotti archive 2011 10 11 knockoutjs custom
  • Visual Studio 2010 intellisense for KnockoutJS inside RequireJS

    我想在 Visual Studio 2010 中获得智能感知 用于淘汰 JS 经过一番研究后我得到的是 reference path lib knockout knockout 2 3 0 debug js gt ko WeGotIntel
  • 如何将 Knockout js 模型绑定到向导风格的 UI

    我正在使用 Knockout js 我有一个包含对象数组的视图模型 我希望允许用户使用向导样式界面编辑其中一个对象 我遇到的问题是向导将根据所做的选择显示不同的步骤 例如 如果用户在步骤 1 中选择 是 则我将显示步骤 2a 如果用户在步骤
  • 指定网格中的默认排序

    使用knockout kendo绑定绑定Telerik Kendo网格时是否可以指定默认排序 我像这样绑定网格 kendoGrid data grid Rows sortable allowUnsort false mode single
  • 如何使用淘汰赛映射插件添加新项目

    我正在尝试一个淘汰制图样本 我想我已经快完成了 我似乎无法向 viewModel foos 添加新的 Foo 谁能看到我在这里错过了什么 var Foo function data var self this self id data id
  • 单击鼠标更改 Knockout.js 中的 css 类

    Knockout js 文档显示了这样的 css 绑定 div Profit Information div 我需要对其进行调整以更改鼠标单击时的 css 类 我怎样才能做到这一点 根据下面的答案 我正在使用这样的代码 CSS class
  • 未捕获的语法错误:实时但不在本地服务器上出现意外的令牌 B

    所以我正在制作一些ajax帖子 它似乎在本地主机上工作正常 但是当我将其发布到亚马逊上的ec2服务器时 我得到 Uncaught SyntaxError Unexpected token B 这似乎表明 JSON 解析失败 完全相同的数据库
  • ko.utils.arrayFirst 在不处理非空字符串的 else 块时始终返回 null

    这可以正确工作 self getById function id return ko utils arrayFirst self PostArray function item if item postId id return item e
  • 使用 Chrome 控制台通过 RequireJS 访问 Knockout ViewModel

    既然我正在使用 RequireJS 如何在 Chrome 控制台中访问 KnockOut ViewModel 变量 在使用 RequireJS 之前 我遵循命名空间模式 将所有内容隐藏在单个全局中 我可以通过在 Chrome 控制台中输入以
  • Knockback.js 生产准备好了吗? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • KnockoutJS - 打印迭代索引作为输入名称

    我正在尝试结合 Spring MVC 创建我的第一个 KnockoutJS 表单视图 ModelAttribute捆绑 数据通过 Ajax 加载并使用 KnockoutJS 填充 通过 KnockoutJS 添加数据 通过 Ajax 和 K
  • 使用自定义绑定处理程序输入文本水印

    我一直在尝试创建一个自定义绑定处理程序 我可以使用它为文本输入字段提供水印行为 By watermark我的意思是 向文本字段添加默认值 这些默认值在焦点时被删除 如果文本字段仍然为空 则在模糊时被替换 我已经设法让它工作 如 jsfidd
  • 当具有复杂类型时,KnockoutJs 中的值绑定无法进行选择

    我正在尝试在选择元素上使用值绑定 如本小提琴中所述 http jsfiddle net MikeEast nM6dd 2 http jsfiddle net MikeEast nM6dd 2 但是 我似乎无法设置所选选项 值绑定 我知道我可
  • 如何从 Knockoutjs toJS() 中排除某些属性

    我有以下模型 var model A One B Two C Three 我将各种 UI 元素绑定到这些字段 效果很好 不过 我将模型转换回 JavaScript 对象 以便可以将任何更改保存到服务器 var goingToServer k
  • Typescript 中此子范围的问题

    This is ALMOST和其他人一样this到目前为止 我已经读过范围界定问题 除了一个细微的差别之外 这使得提出这个问题变得有意义 imo 现在最初我的问题是范围this使用 Knockout 和 Typescript 因此给出以下内
  • Knockout ObservableArray 不更新 HTML Foreach

    所以我有一个可以正常工作的 observablearray 但 UI 没有更新 我读过很多人遇到这种类型的问题 但我没有看到 所以 HTML 是 tbody tr td span class label label success Yup
  • 如何将 HTML 表格导出到 Chrome 和 IE 支持的 Excel?

    在我的 MVC 项目中 我有一个与 Knockout 绑定的 HTML 表 我正在尝试将表格导出到 Excel 我在客户端尝试使用 JavaScript self exportToExcel function javascript wind
  • 对模板之一的 observableArray 进行排序

    我有以下视图模型 function instance id FirstName extend this id ko observable id FirstName ko observable FirstName 我在 observableA

随机推荐

  • 在 Eclipse IDE 环境之外执行 Eclipse 插件 (jdt/ast)

    我可以执行吗Eclipse Java 开发工具 http www eclipse org jdt 作为一个独立的进程 我需要获取 Java 程序AST http www vogella com articles EclipseJDT art
  • SQL Server 2000:如何从存储过程将图像变量保存到文件系统中的文件

    我有一个存储过程 它接收 Data image范围 我想将它从存储过程保存到文件系统 知道怎么做吗 您可以使用 OLE 自动化 ADODB Stream 从 SQL Server 2000 存储过程写入二进制数据 如下所述here http
  • Windows Phone 7 按钮“边框”

    默认情况下 WP7 按钮被 5 像素左右的黑色空间包围 我想删除这个 但我尝试将 Margin BorderThickness Padding 属性设置为 Thinkness 为零 但这似乎对这个神秘的空间没有任何影响 任何线索这个空间到底
  • 如何子类化 WPF 的 TreeViewItem 并在 treevview 中使用它

    我创建了一个简单的依赖属性 我想将其附加到 TreeViewitem 我已经为其他控件 例如按钮 做了类似的事情 但无法弄清楚如何在树视图中使用 TreeViewItem 而不丢失我定义的样式 通过下面的代码 我得到 用于类型 ErrorT
  • 并发写入文件

    在go中 如何控制对文本文件的并发写入 我问这个问题是因为我将有多个 goroutine 使用相同的文件处理程序写入文本文件 我写了这段代码来尝试看看会发生什么 但我不确定我是否做得 正确 package main import os sy
  • iOS 中隐式动画具体什么时候发生?

    每个人和每本书都声称 CALayer 中存在隐式动画 然而 到目前为止 每次我想验证这一点时 我都会以硬性捕捉到设定值告终 根本没有动画 这是一个项目中没有发生任何其他事情的示例 我所做的就是创建一个视图 然后获取它的 CALayer 实例
  • 按照 Matlab 中出现的顺序读取文件夹中的所有文本文件

    我目前有 20 个文本文件 命名从 file1 到 file20 我正在使用 matlab 将它们读入 filePattern fullfile myFolder txt dataFiles dir filePattern for k 1
  • 使用 Typescript 在 Material-UI 中的 createMuiTheme 中向背景属性添加属性

    我正在尝试在 createMuiTheme 中添加一个新属性 但 Typescript 不让我这样做 我按照这里的说明进行操作 https next material ui com guides typescript customizati
  • 使用 Google reCaptcha 总是显示“in Correct-captcha-sol”

    我正在尝试在我的网站上使用 Google reCaptcha 在学习了几个教程后 我在 HTML 页面上使用如下 section class row div class col full div section
  • 如何将 @JsonSnakeCase 设置为 Dropwizard 中的默认配置

    我将如何配置 Jackson 在 dropwizard 中使用蛇形案例 而不是将 JsonSnakeCase 放在每个类中 最后我能够找到答案 只需添加以下配置 environment getObjectMapperFactory setP
  • 如何使用 Swift 刷新我的应用程序中的 Google 地图?

    我制作了一个选项卡栏应用程序 其中一个选项卡 MapTab 由 GoogleMap 组成 而另一个选项卡 ImageTab 则保存所有图像 现在 当图像保存在 ImageTab 中时 它会以标记的形式显示在 MapTab 上 现在我的问题是
  • NumPy 中的 ndarray 和 array 有什么区别?

    有什么区别ndarray https numpy org doc stable reference generated numpy ndarray html and array https numpy org doc stable refe
  • Xamarin 方向传感器矢量角

    我在用着Xamarin Essentials OrientationSensor在我的项目中 我无法解释QuaternionAPI 为我提供了新的读物 问题描述 Here s a figure describing my problem 我
  • 在 Ubuntu 11.04 中禁用堆栈崩溃保护

    我在 2007 年 MacBook 上运行 32 位 Ubuntu 11 04 并且刚刚开始了解缓冲区溢出漏洞 我正在尝试运行书中的示例程序 但 Ubuntu 的安全措施使我无法成功执行缓冲区溢出 这是我尝试运行的代码 include
  • Flutter - 删除滑块中的默认填充

    我想知道如何删除默认填充Flutter Slider 电流输出是这样的 默认填充滑块的形状清晰可见 这是我的代码 Positioned child Align alignment Alignment bottomLeft child Sli
  • PyCharm 5 找不到 Django 1.9 模板

    当我使用 PyCharm 5 0 3 调试我的应用程序时 我想在模板文件 Django 1 9 中插入一些断点 但是 当我在 PyCharm 调试模式下运行应用程序时 它会在处理第一个请求后立即打印以下警告 警告 模板路径不可用 请在 se
  • Linq:存储为文本时按日期排序

    我需要按日期排序 但日期以文本形式存储在数据库中 我正在使用 Linq to 实体来执行查询 根据数据库的设计方式 将该列更改为日期列是不可行的 因为该列中有许多不同的数据类型 有一个名为的鉴别器列type所以我会知道特定行是什么类型 您可
  • 使用WebSocket上传大文件

    我正在尝试使用 WebSocket API 上传大文件 至少 500MB 最好达到几 GB 问题是我不知道如何编写 发送文件的这一部分 释放所使用的资源 然后重复 我希望我可以避免使用 Flash Silverlight 之类的东西 目前
  • 在新列中获取具有相似地址的 id

    我有一个数据帧 我从中处理一些列 以获取每个客户 ID 的地址与每个其他客户 ID 的地址的匹配百分比 如果某些地址与其他地址的匹配百分比高于 80 那么我想在新列中收集其相应的客户 ID 我编写了代码 在其中获取元组列表 其中每个元组中都
  • $root 和 $parent 有什么区别?

    我正在学习 KnockoutJS 但我不明白两者之间的区别 root and parent用法 请参见这个jsfiddle http jsfiddle net supercool 2gt4K 27 或下面的代码 div data Value