— Polymer — 2 min read
有两种监听器:
每个监听器都有一个或多个 依赖 ,当依赖发生可监听的变化是,监听方法就会被调用。
Computed properties are virtual properties based on one or more pieces of the element's data. A computed property is generated by a computing function—essentially, a complex observer that returns a value.
计算属性顾名思义,是由一个返回某个值的计算函数算出来的属性。
只有当元素初始值加载完毕并且至少有一个依赖的属性被定义(undefined => somevalue
),监听器才会被调用。
Polymer.Async
库来将它放到异步任务队列里面去。简单监听器需要在properties
中需要监听的property里面注册。监听函数里面不能依赖其他任何property
Simple observers are fired the first time the property becomes defined (!=
undefined
), and on every change thereafter, even if the property becomes undefined.
简单监听器第一次触发在property被定义后(undefined
=> somevalue
),在此之后,任何property变化(包括重新变回undefined
)都会被调用。
Simple observers only fire when the property itself changes. They don't fire on subproperty changes, or array mutation.
简单监听器只会响应当前property的可观察变化(observable changes)
You specify an observer method by name. The host element must have a method with that name.
简单监听器的定义和实现(函数本身)必须一一对应,简单监听器的实现可以在当前class里面也可以继承自superclass也可以添加自mixin。
The observer method receives the new and old values of the property as arguments.
简单监听器接受两个参数: oldValue
,newValue
复杂监听器需要在this.observers
数组里面注册,复杂监听器可以监听多条路径(依赖)
注册函数里面的参数有如下几种:
一个简单的属性路径 (firstName
).
一个简单的子属性路径 (address.street
).
一个数组的变化结果路径 (users.splices
).
一个包含通配符的路径 (users.*
).
函数被调用时所得到的参数依据监听的路径种类不同而不同:
Note that any of the arguments can be
undefined
when the observer is called.
监听函数中每次调用,任何一个参数都有可能是undefined
复杂监听器的参数只有新值没有旧值
数组变化路径的参数change record是一个对象,包含一个indexSplices
数组,数组中的每一项表示一处变更记录,包含下面信息:
index
. 变更其实的地方removed
. 被删除的数据addedCount
. 插入的数据长度object
: 一个指向新数据的数组(不是拷贝) //A reference to the array in question. 这句话不懂什么意思type
: 一个值为'splice'的字符串注意: change record也许会为undefined
通配符路径的参数是一个change record对象,包含:
path
监听器监听的路径value
新值base
通配符之前的路径所代表的对象如果通配符路径监听到的是数组的变化,那么
path
则是该数组的路径(不包括.splices
)value
里面则会包含一个indexSplices
项Observers shouldn't rely on any properties, sub-properties, or paths other than those listed as dependencies of the observer. This creates "hidden" dependencies
监听器不能依赖任何其他未被注册过的路径,否则:
For example:
Note that Polymer doesn't guarantee that properties are initialized in any particular order.
Polymer不能保证属性之间的初始化顺序。
Computed properties are virtual properties computed on the basis of one or more paths. The computing function for a computed property follows the same rules as a complex observer, except that it returns a value, which is used as the value of the computed property.
计算属性定义跟复杂监听器类似,但是计算属性的计算函数需要返回一个值。
计算属性需要在properties里面的property配置对象中使用computed键注册,注册语法跟复杂监听器一致。
另外见 : Computed Bindings
If the observer method is declared in the
properties
object, the method is considered dynamic: the method itself may change during runtime. A dynamic method is considered an extra dependency of the observer, so the observer re-runs if the method itself changes. For example:
如果一个监听器或者计算属性的方法被定义在了properties
里面,那么我们可以动态的对这个方法进行覆盖、重写。
当方法发生变化的时候,新的简单监听器或计算属性会被立即触发或者被更新。
计算属性formattedName
的方法formatter
发生变化的时候,尽管依赖name
没有变化,但是该属性还是触发更新了。
因为动态监听器方法出于properties里面,因此会被看作一个依赖,一旦这个方法被定义,监听器就在初始化的时候触发,尽管其他依赖都没有被定义。
In some cases, you may want to add an observer or computed property dynamically. A set of instance methods allow you to add a simple observer, complex observer, or computed property to the current element instance.
使用js API来动态添加计算属性或监听器
_createPropertyObserver
_createMethodObserver
_createComputedProperty
第三个参数代表这个方法(_observedPropertyChanged
)是否应该被看作一个依赖
第三个参数代表这个方法(_observeSeveralProperties
)是否应该被看作一个依赖
第三个参数代表这个方法(_computeNewProperty
)是否应该被看作一个依赖