Aurelia Repeat.for 在模型更改时不会刷新

2023-12-28

我想使用 Aurelia 构建一个简单的自定义组件,允许用户输入一个或多个字符串。当有多个项目时,应显示列表remove列表中每个项目的按钮。

我的问题是列表的第一项没有显示remove当列表中有多个项目时按钮。这就是它的样子 https://i.stack.imgur.com/suVD6.png

这是我的自定义列表组件的代码和 html:

View

<template>
  <div repeat.for="item of items">
    <input type="text" value.bind="items[$index]">
    <button click.delegate="remove($index)" 
            if.bind="hasMoreThanOne()">Remove</button>
  </div>
  <button click.delegate="add()">Add</button>
</template>

视图模型

export class List {
  items: string[];

  constructor() {
    this.items = [];
    this.add();
  }

  add() {
    this.items.push("");
  }

  hasMoreThanOne() {
    return this.items.length > 1;
  }

  remove(index) {
    this.items.splice(index,1);
  }
}

我的问题有两个:

  • 为什么列表长度更改时第一个列表项不会自动更新?
  • 如何使第一项也显示删除按钮?

Aurelia 对待任何属于bind命令作为纯函数。这意味着在传递给函数的参数发生更改之前,它不会再次调用该函数。自从hasMoreThanOne()具有一个返回值,该值根据不是函数参数的内容而变化(当然,因为该函数没有任何参数),Aurelia 不会再次调用该函数。

当数组更改时,Aurelia 不会重新评估函数的原因是中继器经过优化,并且发现数组中的第一项没有更改,因此它只是继续使用现有的 DOM。通过正确创建的视图,这有助于极大地提高性能,但就您而言,它会导致不必要的问题。

您找到了一种非最佳的方法来处理这个问题,那就是使用 getter。这不是最佳的原因是 Aurelia 默认情况下每 200 毫秒使用一次脏检查来检查 getter 的更改。这解决了您遇到的问题,但对于性能而言并不理想。

最简单的选择,考虑到多么简单hasMoreThanOne()函数就是简单地将函数内联到绑定中,如下所示:

<template>
  <div repeat.for="item of items">
    <input type="text" value.bind="items[$index]">
    <button click.delegate="remove($index)" 
            if.bind="items.length > 1">Remove</button>
  </div>
  <button click.delegate="add()">Add</button>
</template>

老实说,这就是我可能会处理的方式。

您也可以像现在一样使用吸气剂,但附加computedFrom对其进行装饰以防止脏检查:

import {computedFrom} from 'aurelia-framework';

export class List {
  items: string[];

  constructor() {
    this.items = [];
    this.add();
  }

  add() {
    this.items.push("");
  }

  @computedFrom('items.length')
  get hasMoreThanOne() {
    return this.items.length > 1;
  }

  remove(index) {
    this.items.splice(index,1);
  }
}

这将为您提供与我上面使用的内联绑定完全相同的性能,但需要编写更多的代码。

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

Aurelia Repeat.for 在模型更改时不会刷新 的相关文章

  • 创建在 Aurelia 中使用依赖注入的类的新实例

    我想创建一个能够创建使用依赖注入的类 MyClass 实现抽象类 的新实例的工厂 我希望工厂看起来像这样 Factory export class Factory public static makeMyClass return new M
  • 在 Aurelia 中,槽可以用于重复绑定吗?

    我想创建一个循环遍历数组并将其应用于数组中的每个项目的自定义元素 例如 自定义元素的视图模板将包含类似以下内容的内容 div div div div
  • Aurelia Repeat.for 在模型更改时不会刷新

    我想使用 Aurelia 构建一个简单的自定义组件 允许用户输入一个或多个字符串 当有多个项目时 应显示列表remove列表中每个项目的按钮 我的问题是列表的第一项没有显示remove当列表中有多个项目时按钮 这就是它的样子 https i
  • Aurelia,如何进行可选绑定

    Does Aurelia支持可选绑定吗 我在任何地方都找不到这个信息 我遇到的问题是我有一个title可能会也可能不会填充在对象数组中的属性 我用一个repeat for and title bind但如果此属性不是对象数组的一部分 我根本
  • 如何使用 Aurelia 通过单击内部锚链接保持在同一页面上?

    我正在为一个项目制定样式指南 目前我希望在锚链接上有一个基本的点击行为 以便它们滚动到相应的 ID 举个例子 a href section a 向下滚动到 div div 在 Aurelia 中 默认行为是将链接视为路由 我无法使内部链接正
  • 将 MaterializeCSS 与 aurelia 结合使用

    我想问是否有一步一步的方法来使用或配置 Aurelia 的materializecss 我目前可以运行我的 Aurelia 应用程序 直到教程中我的 index html 看起来像这样
  • aurelia 中的自定义属性不起作用?

    我正在学习 Aurelia 的工作原理 并且正在尝试让一个简单的自定义属性正常工作 它所做的只是根据某些值的变化来改变 div 文本的颜色 我有一个 div 其中包含 high bind changeColor 在我的属性中我有 impor
  • 将属性从视图模型绑定到 Aurelia 中的自定义元素

    UPDATE 其他人报告说这个样本对他们来说效果很好 听起来好像我做错了什么 但我不再有代码 所以我无法检查问题出在哪里 原问题 我有以下自定义元素以及以下视图模型和视图 import bindable from aurelia frame
  • DevExtreme 和 Aurelia 集成

    DevExtreme 支持角度指令 如图所示 我如何才能通过 Aurelia 实现同样的目标 显示集成的示例 https www youtube com watch v iIZj6hOFg0o https www youtube com w
  • 如何在 Aurelia 中渲染不同的视图结构?

    我的 app html 中有一个通用的 html 结构 以便应用于所有页面
  • 尝试加载瞬态 Web Worker 时出现“Reflect.defineMetadata”错误

    我正在尝试从 Web Worker 内部加载 aurelia 框架 以便将 Worker 装饰为瞬态 这是工人装载机 importScripts jspm packages system js System config defaultJS
  • 如何将虚拟机组合到 Aurelia 验证渲染器中的视图中

    我正在尝试使用 aurelia validation 插件对表单执行验证 我正在创建一个自定义验证渲染器 它将更改输入框的颜色并在框旁边放置一个图标 单击或悬停该图标时 会出现一条弹出消息 其中显示实际的错误消息 目前 我正在渲染器中手动渲
  • 到 ref 属性的绑定何时在 Aurelia 中生效?

    这是这个问题的后续 访问 Aurelia 中的 DOM 元素 https stackoverflow com questions 29863044 access a dom element in aurelia 屏幕激活生命周期中是否有一个
  • Aurelia 验证 - 验证失败时不显示任何消息

    我一直在研究 Aurelia Validation 示例 并且有以下内容 索引 html
  • Aurelia:创建嵌套/多级导航菜单的简单方法

    我需要创建一个多级导航菜单 菜单的内容根据用户的不同而不同 我计划通过一个以 JSON 形式返回数据的服务来提取可包含子项数组的导航项集合 我见过的每个导航 路由示例都使用静态路由或单级菜单 我已经阅读了一些有关子路由的内容 但这似乎不是我
  • Aurelia 中的角度服务?

    我还没有找到详细说明如何从 Angular 1 x 迁移到 Aurelia 的详细文档 到目前为止 我只看到人们详细介绍了 Angular 的概念directive可以在 Aurelia 中使用重制 customElement 好吧 足够简
  • 两种方式绑定在使用 aurelia 的 bootstrap-select 上不起作用

    我已成功创建一个自定义元素来使用 boostrap select 元素 但是 我可以从主视图 父视图 向其传递 绑定值 但当我使用双向绑定时 我无法从元素中获取选择 我的自定义元素是 import inject customElement
  • Docker 端口未映射

    如果这很明显 我很抱歉 但我很难从主机上的容器外部访问 Docker 化服务器 这就是我正在做的 我使用以下命令运行容器 docker run it rm name aurelia dev p 8888 8080 v Users tersk
  • Aurelia 验证规则:无法解析访问器函数

    看来其他地方也存在各种问题aurelia validation模块 但我还没有看到任何可以解决我遇到的具体问题的内容 我有一个模型类 其定义和验证规则如下 我的模型 js my model name full short Validatio
  • Aurelia 验证不适用于对象属性

    我无法让 Aurelia Validate 处理我的日历记录中的字段 日历 html 摘抄

随机推荐