《Ember.js实战》——2.3 计算属性

2.3 计算属性

计算属性是一个函数,其返回一个从其他变量或表达式(也可以是其他计算属性)获取的值。计算属性与普通JavaScript函数之间的区别在于,Ember.js将计算属性看作其真正的属性。因此,就可以在计算属性上调用get()和set()等`方法,以及绑定/观察它们(观察者概念在本章稍后介绍)。通常,在模型对象中定义计算属性,并在控制器和视图中使用它。

目前的记事本应用程序还没用上计算属性,但如果你想增强应用程序功能,在界面左边的事项列表中显示每条事项前20个字符的内容,那么,就请忘掉使用jQuery选择器以及在视图某处注入/替代信息的方式,现在可以通过Ember.js的计算属性来实现。

接下来在Notes.Note类中创建一个名为introduction的计算属性,用来返回每条事项前20个字符的内容。修改Notes.Note模型类,如代码清单2-3所示。

代码清单2-3 创建introduction计算属性

Ember.js在这里实现了大量功能。首先,Ember.js能够智能感知对计算属性返回值进行计算的时机和频率。只有用到计算属性,才会计算其返回值。这对性能而言非常有利,因为应用程序不用浪费时间计算那些有可能从不在界面上显示的大量属性。

了解如何将一个函数定义为计算属性的方式,将有助于了解对计算属性进行计算的第二层意思。property('value')意思是“无论this对象的value属性何时改变,都对计算属性的返回值进行重新计算”。因此,当在文本区域字段输入内容到事项的value属性,可以看到界面立即发生了更新,以反映这种变化。

到目前,尚未将introduction计算属性添加到模板中去,我们将用它来预览每条事项。代码清单2-4扩展了notes模板,以在事项列表显示value属性前20个字符的内容。

代码清单2-4 在notes模板中添加introduction计算属性

我们只在模板中添加了一行代码。如果当前Note模型的introduction属性非null,则其内容长度大于0,那么就打印新行,之后输出introduction属`性自身内容。修改后的记事本应用程序如图2-7所示。

前面提到可以将计算属性当作setter来用。但如何设置一个从其他关联属性获取的值呢?在代码清单2-5中,一个名为Notes.Duration的对象拥有一个durationSeconds属性。尽管对后台服务而言以秒为单位存储时长是有意义的事情,但对于用户来讲,看到秒数就显得很不直观。因此,我们应该将秒数转换成以冒号隔开的“时:分:秒”格式的字符串。

代码清单2-5 将计算属性当作setter

要注意的第一件事就是计算属性函数现在包含了两个参数:key和value。你可以通过检测这两个参数来判断函数是作为getter还是setter来调用。根据请求,对于value参数,null可能有意义也可能无意义,因此不能用是否为null来判断。你希望输入有效格式时才更改durationSeconds属性,因此,先将输入值各部分分解到一个数组中,然后验证输入值。如果输入合法,开始将HH:MM:SS格式字符串转换成秒数,之后用新值更新对象durationSeconds属性。`

计算属性函数的第二部分是getter,如你预料的,与setter部分相反。其首先获取durationSeconds属性值,之后生成durationString并`返回。

你大概已经想到了,通过简单地绑定到文本区域字段元素,以这种方式使用计算属性来填充输入字段是相当简单的。Ember.js只需关注将秒数自动格式化为易读的时长,而反过来当用户更改文本区域字段中的时长时也一样。

前面还提及计算属性可以通过观察者来计算它的值,但你还未能一睹Ember.js观察者模式的庐山真面目,接下来就来了解它。

时间: 2024-09-17 04:21:05

《Ember.js实战》——2.3 计算属性的相关文章

《Ember.js实战》——2.5 Ember.js对象模型

2.5 Ember.js对象模型 Ember.js扩展了JavaScript默认对象类的定义,以构建一个更强大的对象模型.此外,Ember.js还支持基于混入类的方式,在模块与模块之间.应用与应用之间共享代码. 你可能想了解Ember.js是怎样知道某个属性发生改变的,以及它何时触发观察者函数和绑定对象.同时你可能还注意到,Ember.js总是要求使get()和set()方法来获取或修改Ember.Object子类对象的属性.当在一个属性上调用set()方法,Ember.js就会检查更新值与对象

vue.js入门教程之计算属性_javascript技巧

前言 计算属性是用来声明式的描述一个值依赖了其它的值.当你在模板里把数据绑定到一个计算属性上时,Vue 会在其依赖的任何值导致该计算属性改变时更新 DOM.这个功能非常强大,它可以让你的代码更加声明式.数据驱动并且易于维护. 模板中表达式非常便利,但是它们实际上只用于简单的操作. 模板是为了描述视图的结构,在模板中放入太多的逻辑会让模板过重且难以维护. 这就是为什么 Vue.js 将绑定表达式限制为一个表达式, 如果需要多于一个表达式的逻辑,应当使用计算属性. 来看这一个简单的例子 <div i

Ember.js中model 与 content 属性的区别

Note:本文基于 Ember.js 1.4.0 Ember.js 里,路由(route)通过 setupController 方法设置控制器(controller)属性:  代码如下 复制代码 App.ApplicationRoute = Ember.Route.extend({   model: function() {     return {'user': '陈三', 'blog': 'http://www.111cn.net/'};   },   setupController: fu

《Ember.js实战》——1.3 Ember.js概览

1.3 Ember.js概览 Ember.js起源于SproutCore框架的第二个版本.在SproutCore 2.0开发期间,SproutCore团队成员已经清楚地认识到,如果想要创建满足目标广泛的Web应用程序的需要,并且体积还保持小巧的易用框架,SproutCore框架的底层结构就需要有个根本改变. SproutCore简介 SproutCore是一个用高度面向组件编程模型开发出来的框架.SproutCore的大多数概念都是从Apple的Cocoa借鉴来的,而Apple也使用Sprout

《Ember.js实战》——导读

前言 2006年起,我已经以某种方式进行Web应用开发.我开始为挪威最大的零售商开发Web应用,先是使用JavaServer Pages(JSP)技术,之后换成JavaServer Faces(JSF).当时这些技术很不错,并能让使用者达到使用目的.在那时(Ajax流行之前),HTTP的请求-响应周期要求将大多数处理逻辑放在服务器端,服务器端在每次请求中传递所有标记.脚本和样式表给浏览器. 虽然以服务器端方式开发Web应用也能行之有效,但状态问题总是绕不开的.由于服务器端要求记住所有登录用户,管

《Ember.js实战》——2.2 自动更新模板

2.2 自动更新模板 Ember.js默认使用Handlebars.js模板引擎.Ember Handlebars实现的一个关键点是无论何时将模板与底层数据联系起来,Ember.js都会在应用各层之间创建双向绑定.在第1章记事本应用程序开发过程中你已经了解了相关工作机制. 思考一下代码清单2-2里的notes/note模板代码. 代码清单2-2 重访notes/note模板 这个示例中包含了两种绑定,第一种是通过Handlebars表达式实现模板绑定:第二种是通过Binding关键字在自定义视图

《Ember.js实战》——第2章 Ember.js风格 2.1 绑定对象

第2章 Ember.js风格 本章涵盖的内容 绑定的工作方式,以及它们对编程风格的影响 自动更新模板的使用 如何及何时使用计算属性及观察者(Observer)模式 Ember.js对象及类模型 本章将在第1章代码的基础上详细阐述Ember.js框架中最具特色的知识点.Ember.js最关键的设计目标之一就是提供完整.合理的默认实现以避免开发者必须自己创建大量样板代码.Ember.js通过默认设置来满足大多数Web应用的需要,并允许开发者在合适之处轻松覆写这些默认设置.有了这些完备选择,我们就可以

《Ember.js实战》——2.7 小结

2.7 小结 本章介绍了一些你可能不太熟悉的Ember.js新概念,以及它不同以往的处理方式. 我们讲述了绑定功能,以确保应用程序各层间数据更新与同步.同时还介绍了自动更新模板,该特性有助于提升开发效率,并使得用户界面总能及时反映模型对象里的数据变化. 拥有了创建.修改及删除事项的能力之后,紧接着我们添加计算属性以增强应用UI效果.接下来还了解了观察者角色,你在记事本应用中创建了一个观察者以观察数组里的属性变化. 之后,我们阐述了Ember.js对象模型,并讨论如何在标准Ember.js对象或自

《Ember.js实战》——1.4 第一个Ember.js应用程序:记事本应用

1.4 第一个Ember.js应用程序:记事本应用 记事本应用大约有200行程序代码(包括模板和JavaScript代码)以及130行CSS代码.你完全可以在Windows.Mac以及Linux等各种操作系统上使用你喜爱的编辑器来开发并运行这个应用. 提示 我使用JetBrains WebStorm来编写JavaScript应用,但这对你来说不是必需的. 你将通过编写一个简单的记事本Web管理应用来一探Ember.js.该应用功能如下. 添加新事项--应用提供了用户添加事项的专用区域. 选择.查