首页 web前端 js教程 Observables 在 KnockoutJs 中如何工作

Observables 在 KnockoutJs 中如何工作

Oct 29, 2024 pm 08:45 PM

Como funcionam Observables no KnockoutJs

此内容基本上是原始材料的翻译。目的是了解 Magento 2 的 KnockoutJs 并用葡萄牙语创建有关 KnockouJs 的内容。

文档

  • KnockoutJs:可观察对象
  • KnockoutJs:可观察数组
  • KnockoutJs:计算可观察量
  • KnockoutJs:可写的计算可观察对象
  • KnockoutJs:纯计算可观察量
  • KnockoutJs:计算可观察量

可观测值

KnockoutJs 引入了 observables 的概念,这些属性是可以被监视并在其值发生变化时自动更新的属性。此功能允许用户界面动态响应 模型.

数据的变化

要在 KnockoutJs 中创建可观察对象,您可以使用 ko.observable() 函数并为其分配初始值。要访问 observable 的当前值,您可以将其视为函数。要仅观察没有初始值的事物,只需调用不带参数的 Observable 属性即可。

let myObservable = ko.observable('Inicial');

console.log(myObservable()); // Irá imprimir 'Inicial'

myObservable('Novo valor');
console.log(myObservable()); // Irá imprimir 'Novo valor'
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
  • ko.isObservable:对于 observablesobservables 数组 和所有计算的 observables 返回 true;
  • ko.isWritableObservable:对于 observablesobservable 数组writable 计算的 observables.
  • 返回 true

订阅

observables 中的 订阅 是一种机制,允许您在 observable 的值发生变化时收到通知。它们对于跟踪可观察量中的变化并对这些变化做出反应、更新用户界面或在必要时采取其他操作至关重要。

subscribe() 方法 *** 接收一个 *callback 函数,每当 observable 的值被修改时就会执行该函数。 callback 函数接收 observable 的新值作为参数。该函数接受三个参数:callback是每当通知发生时调用的函数,target(可选)在函数callback中定义this的值和event(可选;默认为change)是接收通知的事件名称。

let myObservable = ko.observable('Inicial');

console.log(myObservable()); // Irá imprimir 'Inicial'

myObservable('Novo valor');
console.log(myObservable()); // Irá imprimir 'Novo valor'
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
  1. change: 这是每当 observable 的值发生变化时触发订阅的默认事件。它是最常见的事件,在没有明确指定其他事件时使用;
  2. beforeChange: 此事件在 observable 的值更改之前触发。 callback 函数将接收两个参数:observable 的当前值和将分配给 observable 的建议(新)值。这允许您在更改之前根据当前值执行操作;
  3. afterChange: 该事件在 observable 的值改变后触发。回调函数将接收两个参数:可观察量的先前值(更改之前)和分配给可观察量的新值。当您需要在发生特定变化后对其做出反应时,它非常有用。
  4. arrayChange: 此事件特定于 Observables 数组。当可观察数组发生更改(例如添加、删除或替换数组中的项目)时会触发它。回调函数采用四个参数:受影响的项目(添加删除状态索引)。

另一个重要的一点是可以将订阅存储在变量中,并在必要时使用 dispose() 方法取消订阅。当您想要暂时或永久禁用 UI 更新以响应可观察值的更改时,这非常有用。

let myObservable = ko.observable(0);

// Criando uma subscription no observable
myObservable.subscribe(function (newValue) {
  console.log('Novo valor do observable:', newValue);
}, scope, event);
登录后复制
登录后复制
登录后复制

确定可观察量类型的方法

  1. isObservable():此方法用于检查值是否为 observable。如果值是 observableobservable、observableArraycompulatedwritable Computed),则返回 true,否则返回 false。
  2. isWritableObservable():此方法检查值是否是可写的 observable (可写 observable)。如果该值是可写的 observable,则返回 true,否则返回 false;
  3. isCompated():此方法用于检查某个值是否是计算的可观察对象。如果值是 Compulated Observable,则返回 true,否则返回 false;
  4. isPureCompulated():此方法检查值是否是纯计算可观察纯计算可观察量 是仅依赖于其他纯可观察量 并且没有内部记录逻辑的一个。如果值是 Pure Computed Observable,则返回 true,否则返回 false。

可观察数组

Observables 数组 是 observables 的扩展,用于处理需要可观察的数据列表。与标准 JavaScript 数组 不同,Observable 数组 允许您自动跟踪列表数据的更改并响应式更新用户界面。

let myObservable = ko.observable('Inicial');

console.log(myObservable()); // Irá imprimir 'Inicial'

myObservable('Novo valor');
console.log(myObservable()); // Irá imprimir 'Novo valor'
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

Observables 数组 具有特定的方法,允许您以反应方式添加、删除和操作项目。其中一些方法是:

  • indexOf(value):返回数组中与其参数相等的第一项的索引,如果没有找到匹配的值,则返回值-1。
  • push(item): 将一个新项目添加到数组的末尾;
  • pop():删除并返回数组中的最后一项;
  • shift():删除并返回数组中的第一项;
  • unshift(item):将新项目添加到数组的开头;
  • remove(item):从数组中删除特定项目
  • ;
  • removeAll([parameter]):从 array 中删除所有项目,并且可以接收 array
  • 形式的参数,该参数将删除传递参数中的项目;
  • Replace(oldItem, newItem):将第一个参数传入的item替换为第二个参数;
  • verse():更改原始数组
  • 中项目的顺序并更新用户界面以反映新顺序;
  • revered():返回数组的反向副本;
  • splice(index, count, items):允许您在数组中的特定位置添加或删除项目;
  • slice():返回 array
  • 子集的副本,从起始索引开始一直到 end-1 索引。开始和结束值是可选的,如果没有提供;
  • sort():确定项目的顺序。如果未提供该函数,该方法将按字母升序(对于字符串
  • )或升序数字顺序(对于数字)对项目进行排序;
  • sorted():返回已排序数组副本。如果你需要不改变原来的可观察数组
  • ,但需要按照特定的顺序显示,则优于sort()方法;

对于修改数组内容的函数,例如 pushsplice,KO 方法会自动触发依赖跟踪机制,以便所有注册的监听器都收到更改通知并且你的界面会自动更新,这意味着使用 KO 方法(observableArray.push(...) 等)和原生 JavaScript array 方法(observableArray() .push(.. .)),因为后者不会向 array

订阅者发送任何内容已更改的通知。

虽然可以像任何其他可观察对象一样使用 subscribe 并访问 observableArray,但 KnockoutJs 还提供了一种超级快速的方法来找出 array observable 确实发生了变化(哪些项目刚刚被添加、删除或移动)。您可以订阅数组
更改,如下所示:

let myObservable = ko.observable('Inicial');

console.log(myObservable()); // Irá imprimir 'Inicial'

myObservable('Novo valor');
console.log(myObservable()); // Irá imprimir 'Novo valor'
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

计算的可观测值

计算的 Observables 是依赖于一个或多个 observables 的函数,只要这些依赖项发生任何变化,就会自动更新。每次其依赖项发生更改时,该函数都会被调用一次,并且它返回的任何值都将传递给 observables,例如 UI 元素或其他 计算的 observables

Compated ObservablesObservables 之间的主要区别是 Compulated Observables 不直接存储值;相反,它们依赖其他可观察值来计算它们的价值。这意味着当 Compated Observable 所依赖的任何 observables 被修改时,它的值总是会自动更新。

let myObservable = ko.observable(0);

// Criando uma subscription no observable
myObservable.subscribe(function (newValue) {
  console.log('Novo valor do observable:', newValue);
}, scope, event);
登录后复制
登录后复制
登录后复制

计算可观察量的方法

  1. dispose():此方法用于在不再需要时处置(清理)计算的可观察对象。它删除与 Compated Observable;
  2. 关联的所有订阅和依赖项
  3. extend():此方法允许您将自定义扩展器添加到计算的Observable。扩展器是可以修改 Compulated Observable; 行为的函数
  4. getDependencyCount():此方法返回依赖于 Compated Observableobservables 数量;
  5. getDependency():此方法返回一个包含 observables 的数组,这些 observables
  6. Compulated Observable
  7. ; 的依赖项 getSubscriptionsCount():此方法返回来自
  8. Compulated Observable
  9. ; 的当前订阅数量 isActive():此方法返回一个布尔值,指示 Compated Observable 当前是否处于活动状态(如果
  10. Compulated Observable
  11. 由于更改而处于评估过程中,则它是活动的在其依赖项中); peek():此方法类似于用于访问 Compulated Observable 的当前值的括号运算符 ()。然而,peek 方法不会在
  12. Compated Observable
  13. 和调用它的地方之间创建依赖关系; subscribe():此方法允许您订阅,以便在
  14. Compated Observable
的值发生变化时接收通知。

ko.compulated 的第二个参数在评估计算的

observable 时设置 this 的值。如果不传递它,就不可能引用 this.firstName() 或 this.lastName()。

有一个约定可以避免完全跟踪它:如果 viewmodel 的构造函数将对此的引用复制到另一个变量(传统上称为 self)中,则可以在整个 viewmodel 并且不必担心它被重新定义以引用其他内容。

let myObservable = ko.observable('Inicial');

console.log(myObservable()); // Irá imprimir 'Inicial'

myObservable('Novo valor');
console.log(myObservable()); // Irá imprimir 'Novo valor'
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

因为 self 在函数闭包时被捕获,所以它在任何嵌套函数中都保持可用和一致,例如 计算的可观察值的求值器。当涉及到事件处理程序时,此约定更加有用。

 计算可观测值

如果计算的可观察量只是根据一些可观察的依赖关系计算并返回一个值,最好将其声明为ko.pureCompulated而不是ko.compulated。

let myObservable = ko.observable(0);

// Criando uma subscription no observable
myObservable.subscribe(function (newValue) {
  console.log('Novo valor do observable:', newValue);
}, scope, event);
登录后复制
登录后复制
登录后复制

计算的可观察量被声明为pure时,其求值器不会直接修改其他对象或状态,KnockoutJs可以更有效地管理其重新求值和内存使用。如果没有其他代码主动依赖它,KnockoutJs 将自动挂起或释放它。

可写的计算可观察量

可写计算的可观察量计算的可观察量的扩展,它允许创建计算的可观察量,可以通过读取和写入来更新。与传统的 Compulated Observables 不同,传统的 Compulated Observables 仅根据其他 observables 计算其值,并且不直接存储值,

Writable Computed Observables

可以存储值,并提供更新该值的函数必要时。 要创建一个可写计算的Observable,需要将 ko.compulated 函数与包含两个主要属性的配置对象一起使用:读和写。 read 属性包含计算函数来确定 observable 的值,而 write 属性包含当您想要更新

observable 的值时调用的函数。

以上是Observables 在 KnockoutJs 中如何工作的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

<🎜>:泡泡胶模拟器无穷大 - 如何获取和使用皇家钥匙
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆树的耳语 - 如何解锁抓钩
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系统,解释
3 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

热门话题

Java教程
1668
14
CakePHP 教程
1426
52
Laravel 教程
1329
25
PHP教程
1273
29
C# 教程
1256
24
JavaScript引擎:比较实施 JavaScript引擎:比较实施 Apr 13, 2025 am 12:05 AM

不同JavaScript引擎在解析和执行JavaScript代码时,效果会有所不同,因为每个引擎的实现原理和优化策略各有差异。1.词法分析:将源码转换为词法单元。2.语法分析:生成抽象语法树。3.优化和编译:通过JIT编译器生成机器码。4.执行:运行机器码。V8引擎通过即时编译和隐藏类优化,SpiderMonkey使用类型推断系统,导致在相同代码上的性能表现不同。

Python vs. JavaScript:学习曲线和易用性 Python vs. JavaScript:学习曲线和易用性 Apr 16, 2025 am 12:12 AM

Python更适合初学者,学习曲线平缓,语法简洁;JavaScript适合前端开发,学习曲线较陡,语法灵活。1.Python语法直观,适用于数据科学和后端开发。2.JavaScript灵活,广泛用于前端和服务器端编程。

从C/C到JavaScript:所有工作方式 从C/C到JavaScript:所有工作方式 Apr 14, 2025 am 12:05 AM

从C/C 转向JavaScript需要适应动态类型、垃圾回收和异步编程等特点。1)C/C 是静态类型语言,需手动管理内存,而JavaScript是动态类型,垃圾回收自动处理。2)C/C 需编译成机器码,JavaScript则为解释型语言。3)JavaScript引入闭包、原型链和Promise等概念,增强了灵活性和异步编程能力。

JavaScript和Web:核心功能和用例 JavaScript和Web:核心功能和用例 Apr 18, 2025 am 12:19 AM

JavaScript在Web开发中的主要用途包括客户端交互、表单验证和异步通信。1)通过DOM操作实现动态内容更新和用户交互;2)在用户提交数据前进行客户端验证,提高用户体验;3)通过AJAX技术实现与服务器的无刷新通信。

JavaScript在行动中:现实世界中的示例和项目 JavaScript在行动中:现实世界中的示例和项目 Apr 19, 2025 am 12:13 AM

JavaScript在现实世界中的应用包括前端和后端开发。1)通过构建TODO列表应用展示前端应用,涉及DOM操作和事件处理。2)通过Node.js和Express构建RESTfulAPI展示后端应用。

了解JavaScript引擎:实施详细信息 了解JavaScript引擎:实施详细信息 Apr 17, 2025 am 12:05 AM

理解JavaScript引擎内部工作原理对开发者重要,因为它能帮助编写更高效的代码并理解性能瓶颈和优化策略。1)引擎的工作流程包括解析、编译和执行三个阶段;2)执行过程中,引擎会进行动态优化,如内联缓存和隐藏类;3)最佳实践包括避免全局变量、优化循环、使用const和let,以及避免过度使用闭包。

Python vs. JavaScript:社区,图书馆和资源 Python vs. JavaScript:社区,图书馆和资源 Apr 15, 2025 am 12:16 AM

Python和JavaScript在社区、库和资源方面的对比各有优劣。1)Python社区友好,适合初学者,但前端开发资源不如JavaScript丰富。2)Python在数据科学和机器学习库方面强大,JavaScript则在前端开发库和框架上更胜一筹。3)两者的学习资源都丰富,但Python适合从官方文档开始,JavaScript则以MDNWebDocs为佳。选择应基于项目需求和个人兴趣。

Python vs. JavaScript:开发环境和工具 Python vs. JavaScript:开发环境和工具 Apr 26, 2025 am 12:09 AM

Python和JavaScript在开发环境上的选择都很重要。1)Python的开发环境包括PyCharm、JupyterNotebook和Anaconda,适合数据科学和快速原型开发。2)JavaScript的开发环境包括Node.js、VSCode和Webpack,适用于前端和后端开发。根据项目需求选择合适的工具可以提高开发效率和项目成功率。

See all articles