在 Knockout 中将参数传递给子组件

2023-12-31

我有一个模板:

<template id="item-list">
  <form action="" data-bind="submit: addItem">
    <input type="text" name="addItem" data-bind="value: newItem">
    <button type="submit">Add Item</button>
  </form>
  <ul class="item-list" data-bind="foreach: items">
    <item params="title: title,
                  $element: $element,
                  $data: $data,
                  $parent: $parent"></item>
  </ul>
</template>
<template id="item">
  <li class="item" data-bind="text: title, click: $parent.removeItem"></li>
</template>
<item-list params="items: items"></item-list>

还有一些具有一定逻辑的组件:

function Item(title) {
  this.title = title
}

ko.components.register('item-list', {
  viewModel: function(params) {
    this.items = ko.observableArray(params.items)
    this.newItem = ko.observable('')
    this.addItem = function() {
      this.items.push(new Item(this.newItem()))
    }
    this.removeItem = function(a) {
      this.items.remove(a.$data)
    }.bind(this)
  },
  template: {element: 'item-list'}
})

ko.components.register('item', {
  viewModel: function(params) {
    $.extend(this, params)
  },
  template: {element: 'item'}
})

function ViewModel() {
  this.items = [
    new Item('One'),
    new Item('Two'),
    new Item('Three')
  ]
}

var vm = new ViewModel()

ko.applyBindings(vm, document.body)

有没有办法直接将项目传递到foreach所以我不必这样做?

<ul class="item-list" data-bind="foreach: items">
  <item params="title: title,
                $element: $element,
                $data: $data,
                $parent: $parent"></item>
</ul>

但更确切地说是这样的:

<item params="$context"></item>

我是淘汰赛新手。我知道我可以将一个对象传递给视图模型并对该对象进行操作,所以而不是this.title我必须做this.object.title or this.$data.title我仍然需要通过$element and $parent手动。

还有其他我缺少的自动化方法吗?


您可以通过$context如下:

<item params="{ context: $context }"></item>

然后在组件代码中:

viewModel: function(params) {
    var ctx = params.context;
    var itemData = ctx.$data;
    $.extend(this, itemData)
},

但是,您似乎根本没有利用上下文,您只是在扩展this与过去的item数据。因此,以下内容也可以:

<item params="{ item: $data }"></item>

viewModel: function(params) {
    $.extend(this, params.item)
},

See Fiddle http://jsfiddle.net/kajms2wo/

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

在 Knockout 中将参数传递给子组件 的相关文章

随机推荐

  • 如何收集实时推文? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 如何使用 Ruby 收集实时推文并将
  • Wicket 1.5(.2) 中的 url 更改时组件未重新加载?

    我第一次使用以下 URL 导航到我的应用程序 主页 0 用户 x 在调试模式下 我看到 wicket 很好地实例化了我的面板等 显然 如果我将 URL 更改为 主页 0 用户 y 那么什么也没有发生 面板不会重新初始化 对于新用户 gt 用
  • React 组件声明中“导出”的目的是什么?

    在 React ES6 中 为什么我有时看到这个吗 class Hello extends React Component 有时this export class Hello extends React Component 有何意义expo
  • 如何在protobuf中定义枚举的值和id? (原始java客户端)

    我对 protobuf 的使用很陌生 我计划编写带有枚举的 protobuf def 有什么方法可以在其中提供 id 值和描述 编译后我希望生成的枚举应该与下面的示例等效 enum Sample W 0 W P 0 P C 0 C B 0
  • Rails + devise:尝试删除用户帐户

    当我尝试在 Rails 应用程序中删除我的帐户时 我得到 没有路由匹配 users My View p We hate to see you go p 我的路线 user registration POST users format act
  • 如何为不同的根目录配置 xampp Web 服务器

    Web 目录是应用程序的所有公共文件和静态文件的所在地 包括图像 样式表和 JavaScript 文件 这也是前端控制器居住的地方 所以问题是当我安装并设置 xampp 时我的 web 目录是 xampp htdocs 我想将其设置为 xa
  • 将现有文件添加到不同的 Visual Studio 2010 项目

    是否可以将文件添加到位于不同目录中的 Visual Studio 项目中 但是将文件保留在这些目录中并在更新项目中的文件时更新这些文件 当我将现有文件添加到项目中时 它所做的只是将它们复制到项目中 然后更新复制的文件 而不是原始文件 有什么
  • 在脚本模块标记中使用 import 语句中的函数

    我正在尝试使用createPopup我使用导入的函数import我的脚本标签中的函数 但是 我总是收到错误消息 指出函数未定义 Uncaught ReferenceError createPopup is not defined 这是我的代
  • Xamarin Forms 自定义主题不起作用

    我有一个使用 Xamarin Forms 2 0 的 Android 应用程序 我制作了一个自定义主题来设置一些颜色 我创建了这些文件 资源 值 styles xml AndroidResource
  • Numpy dtype - 数据类型不理解

    我有一个数据框 我正在查看与每列关联的数据类型 当我跑步时 In 23 df dtype descr Out 24 u date
  • Ruby 中具有前瞻功能的正则表达式

    我当前的正则表达式之争是替换字符串中数字之前的所有逗号 然后 正则表达式必须忽略所有以下逗号 我已经在 rubular 上折腾了大约一个小时 但似乎没有什么效果 测试字符串 this is a sentence33 Here is anot
  • Contiki 无线编程

    我正在通过一个项目开始在天空微粒上使用 Contiki 我现在正在尝试让无线编程正常工作 我一直在查看 example sky shell exec 和 apps shell 我觉得我需要通过 sky shell exec 和可能的 tes
  • 服务器发送事件和浏览器限制

    我有一个监听服务器发送事件的 Web 应用程序 当我在打开多个窗口的情况下进行工作和测试时 事情不起作用 我多次撞到头 朝错误的方向看 最终 我意识到问题出在并发连接上 然而 我测试的数量非常有限 即使我在 Apache 上运行测试 我知道
  • 在 Python 2.7.3 / Raspberry Pi 中使用特殊字符取消转义 HTML

    我被困在这里试图取消转义 HTML 特殊字符 有问题的文本是 Rudimental amp Emeli Sand 应该转换为Rudimental 和 Emeli Sand 文本通过 WGET 下载 在 python 之外 要对此进行测试 请
  • 如何根据其中的数据使整个活动可滚动

    我尝试过 LinearLayout 在其中放置了几个文本视图 我对每个视图都完全使用权重 当数据长度太大并且文本视图无法完全显示时 就会出现问题 我也尝试过tabletlayout 但那东西也不起作用 因为最终tablelayout是在有重
  • Magento - 仅加载可配置的产品

    我有以下代码 productCollection this gt getLoadedProductCollection foreach productCollection as product if product gt data type
  • 使用 wget 在 R 中下载.file

    我尝试访问的网页下载了一个附件 但标头状态始终为 500 我已通过邮递员检查过 我在用download file with wgetR 中的方法下载该文件 但它停止并且不下载 因为标头状态为 500 无论标头状态如何 如何管理下载此文件 当
  • 我在启用 android.useAndroidX 的情况下收到“AndroidX依赖项”错误

    我在尝试构建 Android 应用程序时收到以下错误 任务 app mergeDebugResources 失败 失败 构建失败并出现异常 什么地方出了错 任务 app mergeDebugResources 执行失败 该项目使用 Andr
  • 如何在C#中将文件保存在同一网络中的另一台机器上?

    我必须将上传的文档保存到另一台本地计算机中 但我不清楚如何在我的代码中使用模拟 我使用了以下代码 protected void btnSave Click object sender EventArgs e int result 0 res
  • 在 Knockout 中将参数传递给子组件

    我有一个模板