【Knockout】二、监控属性Observables

2024-01-02 01:48

本文主要是介绍【Knockout】二、监控属性Observables,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

MVVM和viewModel

Knockout是建立在以下三大核心功能之上的:

  1. 监控属性和依赖跟踪(Observables and dependency tracking)
  2. 声明式绑定(Declarative bindings)
  3. 模板(Templating)

首先让我们先来了解下MVVM模式,和viewModel的概念。

MVVM(model、view、viewModel)是一种创建用户界面的设计模式,他旨在将一个复杂的UI简单的分割为三个部分:

  • model : 在你的应用中用作存储数据;
  • view : 一个可见的、交互的UI来展现viewModel的状态;
  • viewModel : 用纯净的代码来展现ui的数据和操作,可是任意的javascript对象

首先创建一个viewModel,仅仅需要声明一个任意的javascript对象,例如:

var viewModel = {name : 'knockout';
};

然后为viewModel创建一个声明式的绑定view,例如:

<div id="myview" data-bind="text : name"></div>

最后激活knockout,例如

ko.applyBindings(viewModel,document.getElementById('myview'));

data-bind属性毕竟不是原生的html属性,即使它能够完美的工作,但是浏览器不认识它,你需要激活knockout以使它生效。

这样就把一个最简单的viewModel和view绑定到了一起,能够在view里显示viewModel的属性name了,但是,目前,view并不能在viewModel的数据改变时,自动更新view上显示的数据,viewModel也不能在view被改变时更新自己的属性数据!

Observables

knockout的一个重要功能observable(监控属性)就是能够自动自动探测相关的依赖与通知订阅者(automatic dependency detection and notification triggering),即在建立绑定关系的view和

viewModel之间能够在一方改变的时候更新另一方的值。

我们将viewModel稍作修改:

 var viewModel = {name : ko.observable("knockout")};

现在他就能监控到变化,view就能够自动更新了。

监控属性的读写操作:

    1.读取监控属性的值:

viewModel.name();

    2.写一个新值到监控属性中:

viewModel.name("new value");

Observable Arrays

如果你想探测并响应一个对象的变化,使用observables,但是,如果你想探测并响应一系列集合的变化,你应该使用observableArray。

当你需要重复的增加或者删除时需要显示或者隐藏一些UI的区域时,observableArray能够派上大用场。

var myObservableArray = ko.observableArray();    // Initially an empty array
myObservableArray.push('Some value');            // Adds the value and notifies observers

注:observableArray跟踪的是数组中的对象,而不是对象的状态。单纯的push一个对象到observableArray中,这个对象的属性并不是observable的,observableArray仅仅跟踪它所拥有的对象,并当有对象从数组中添加或删除时通知监听者。

也可以像这样初始化一个observableArray:

 

// This observable array initially contains three objects
var anotherObservableArray = ko.observableArray([{ name: "Bungle", type: "Bear" },{ name: "George", type: "Hippo" },{ name: "Zippy", type: "Unknown" }
]);

 

Computed Observables (依赖监控属性)

如果你有一个observable的firstname和一个observable的lastname,你想显示fullname怎么办?computed observables派上用场了,它是一个依赖于其他一个或者多个observables的函数,并在任意一个依赖的observable更新时它能够自动更新。

例如:有这样一个viewModel:

function AppViewModel() {this.firstName = ko.observable('Bob');this.lastName = ko.observable('Smith');
}

你可以添加一个computed observable来得到fullname:

 

function AppViewModel() {// ... leave firstName and lastName unchanged ...this.fullName = ko.computed(function() {return this.firstName() + " " + this.lastName();}, this);
}

 

绑定UI元素:

The name is <span data-bind="text: fullName"></span>

当firstname或者lastname改变时fullname能够自动更新。

可以这样使用:

  • 监控属性items表示items的集合;
  • 监控属性selectedIndexes存储当前选中的items的index集合;
  • 依赖监控属性selectedItems表示当前选中的items集合;

改变items或者selectedIndexes都能够使依赖监控属性(selectedItems)更新,以达到更新相应的UI元素的目的。

 管理this : 

ko.computed的第二个参数决定了this的值当我们计算依赖监控属性的值的时候,如果不传它,将不能够引用到this.firstname()或者this.lastname().

你也可以这样做,更加方便:

 

function AppViewModel() {var self = this;self.firstName = ko.observable('Bob');self.lastName = ko.observable('Smith');self.fullName = ko.computed(function() {return self.firstName() + " " + self.lastName();});
}

 

self能够在funciton的闭包中被捕获到,在它任何的内嵌的function中任然是可用的。

判断一个属性是否为依赖监控属性(computed observable)

for (var prop in myObject) {if (myObject.hasOwnProperty(prop) && !ko.isComputed(myObject[prop])) {result[prop] = myObject[prop];}
}

另外,ko提供了一些函数能够操作监控属性和依赖监控属性:

  • ko.isObservable : 对于所有的observable,observable array,computed observable将返回true;
  • ko.isWritableObservable : 对于所有的observable,observable array,writable computed observable返回true;

 使用peek控制依赖关系:

正常情况下,ko的自动依赖跟踪能够完成你所期望的工作,但是,你也许希望控制哪个observable来更新或者不更新你的computed observable,peek()函数能够使你的observable或者computed不创建依赖关系。

例如:

 

ko.computed(function() {var params = {page: this.pageIndex(),selected: this.selectedItem.peek()};$.getJSON('/Some/Json/Service', params, this.currentPageData);
}, this);

 

在这个例子中,一个computed observable依赖其他两个observable使用ajax获取数据,当pageIndex改变的时候,computed observable就会更新,重新获取数据,但是computed observable会忽略掉selectedItem的改变,

因为它使用了peek()。在这种情况下,用户也许只希望使用selectedItem的值仅仅作为跟踪目的当一个新的数据集合下载完成以后。

构造computed observable

一个computed observable可以使用以下方式构造:

1.ko.computed( evaluator [, targetObject, options] )

    • evaluator : 一个用来计算当前依赖监控属性的值的函数。
    • targetObject : 可选,如果定义了,它将作为ko激活你的回调函数时候的this值。
    • options : 可选,备用。

2.ko.computed(options),options包含以下属性:

    • read : 必须的。用来计算当前依赖监控属性的值的函数。
    • write : 可选的。使依赖监控属性writable,这个函数接收一个value参数以用来write到computed observable中。
    • owner : 可选的。如果定义了,它将作为回调函数的this值。
    • pure : 可选的。如果为true,这个computed observable将被设置为pureComputed observable。
    • deferEvaluation : 可选的。不常用
    • disposeWhen : 可选的。不常用
    • disposeWhenNodeIsRemoved : 可选的。不常用。

computed observable的使用

  • dispose() : 手动管理依赖监控属性,清楚所有依赖的订阅关系,这个函数非常有用,当你想停止computed observable的更新或者清除内存的时候
  • extend(exteners) : 扩展方法。
  • getDependenciesCount() : 返回当前computed observable的依赖数量。
  • getSubScriptionsCount() : 
  • isActive() : 返回computed observable是否会更新在将来的某个时候,一个没有任何依赖的computed observable是不会被激活的
  • peek() : 返回computed observable中没有创建依赖关系的值。
  • subscribe(callback,[callbackTarget,event]) : 注册一个手动的订阅来接收computed observable改变的通知。

 

 

这篇关于【Knockout】二、监控属性Observables的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/561032

相关文章

流媒体平台/视频监控/安防视频汇聚EasyCVR播放暂停后视频画面黑屏是什么原因?

视频智能分析/视频监控/安防监控综合管理系统EasyCVR视频汇聚融合平台,是TSINGSEE青犀视频垂直深耕音视频流媒体技术、AI智能技术领域的杰出成果。该平台以其强大的视频处理、汇聚与融合能力,在构建全栈视频监控系统中展现出了独特的优势。视频监控管理系统EasyCVR平台内置了强大的视频解码、转码、压缩等技术,能够处理多种视频流格式,并以多种格式(RTMP、RTSP、HTTP-FLV、WebS

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

滚雪球学Java(87):Java事务处理:JDBC的ACID属性与实战技巧!真有两下子!

咦咦咦,各位小可爱,我是你们的好伙伴——bug菌,今天又来给大家普及Java SE啦,别躲起来啊,听我讲干货还不快点赞,赞多了我就有动力讲得更嗨啦!所以呀,养成先点赞后阅读的好习惯,别被干货淹没了哦~ 🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,助你一臂之力,带你早日登顶🚀,欢迎大家关注&&收藏!持续更新中,up!up!up!! 环境说明:Windows 10

kubernetes集群部署Zabbix监控平台

一、zabbix介绍 1.zabbix简介 Zabbix是一个基于Web界面的分布式系统监控的企业级开源软件。可以监视各种系统与设备的参数,保障服务器及设备的安全运营。 2.zabbix特点 (1)安装与配置简单。 (2)可视化web管理界面。 (3)免费开源。 (4)支持中文。 (5)自动发现。 (6)分布式监控。 (7)实时绘图。 3.zabbix的主要功能

基于树梅派的视频监控机器人Verybot

最近这段时间做了一个基于树梅派 ( raspberry pi ) 的视频监控机器人平台 Verybot ,现在打算把这个机器人的一些图片、视频、设计思路进行公开,并且希望跟大家一起研究相关的各种问题,下面是两张机器人的照片:         图片1:                   图片2                    这个平台的基本组成是:

PC与android平板通过浏览器监控Verybot的视频

下面这个视频是PC与android平板通过浏览器监控Verybot的视频:           http://v.youku.com/v_show/id_XNjYzNzYyMTIw.html

HTML5自定义属性对象Dataset

原文转自HTML5自定义属性对象Dataset简介 一、html5 自定义属性介绍 之前翻译的“你必须知道的28个HTML5特征、窍门和技术”一文中对于HTML5中自定义合法属性data-已经做过些介绍,就是在HTML5中我们可以使用data-前缀设置我们需要的自定义属性,来进行一些数据的存放,例如我们要在一个文字按钮上存放相对应的id: <a href="javascript:" d

Python中的属性装饰器:解锁更优雅的编程之道

引言 在Python的世界里,装饰器是一个强大的工具,它允许我们以一种非侵入性的方式修改函数或方法的行为。而当我们谈论“属性装饰器”时,则是在探讨如何使用装饰器来增强类中属性的功能。这不仅让我们的代码更加简洁、易读,同时也提供了强大的功能扩展能力。本文将带你深入了解属性装饰器的核心概念,并通过一系列实例展示其在不同场景下的应用,从基础到进阶,再到实际项目的实战经验分享,帮助你解锁Python编程

java后端服务监控与告警:Prometheus与Grafana集成

Java后端服务监控与告警:Prometheus与Grafana集成 大家好,我是微赚淘客返利系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿! 在现代的微服务架构中,监控和告警是确保服务稳定性的关键组成部分。Prometheus和Grafana是两个强大的工具,它们可以集成在一起,为Java后端服务提供实时监控和可视化告警。 服务监控的重要性 服务监控可以帮助我们实时了解服务的健

react笔记 8-17 属性绑定 class绑定 引入图片 循环遍历

1、绑定属性 constructor(){super()this.state={name:"张三",title:'我是一个title'}}render() {return (<div><div>aaaaaaa{this.state.name}<div title={this.state.title}>我是一个title</div></div></div>)} 绑定属性直接使用花括号{}   注