本文共 2655 字,大约阅读时间需要 8 分钟。
Meteor里面的Session不是我们以前接触过服务端的Session, 这里的Session是在客户端使用的(浏览器)一个对象。不过它功能和服务端Session有一点相似,那就是都是用来保存数据的。这个保存的数据是一个活性数据源。当然,Session在客户端是个全局变量,在客户端任何地方都可以直接使用它。
在详细说明之前,先看它的几个函数。如果有一点编程经验根据函数名就知道它的作用了。注意,Session对象只存在于客户端,它的函数也只能在客户端使用。不能在服务端使用,服务端是没有Session这个对象的。
在Session中保存或修改一个键值对。key 是String类型,value是个EJSON对象,当然也就包括基本数据类型。
例如:
Session.set("people","张三");//保存一个新的键值对....Session.set("people",{ name:"张三",age:18}) ;//修改键值对。这里仅为了展示能保存的数据类型才选择不同数据类型,通常情况下,保存的数据类型是不会变化的,因为通常需要绑定元素或其他动作。
设置默认值,当key的value未定义时。 如果value有定义,那么它的效果和set一样。
获取键的值。
session对象只有以上几个函数,相对来说比较简单。下面说说个人使用的经验。
想来说说活性数据源的问题。
官方没有给出完整的定义,只是用单词Reactivity Data来描述,我不清自己翻译成活性数据源是否正确。理解起来很简单,所有使用了活性数据源的funcation(这里指 Template对象中使用的function)和template 一旦它所依赖的活性数据源发生值的变化,那么它将重新调用或者渲染。
简单看个代码。结构如下:(”-“代表应用根目录)
- --client #文件夹 |-API-005.html |-API-005.js
API-005.html:
API-005 { {> testValue}}
{ {> testFunction}} { {testSessionChangeForValue}} { {testSessionChangeForFunction}}
API-005.js:
Session.setDefault("name","test");//设置默认值var demoFunctionWillNotCall = function (){ var s = Session.get("name") console.log("name Session 改变,发生调用");//这句话永远不会打印,哪怕name发生改变。因为它没有被任何Template对象调用}var demoFunctionWillCall = function(){ var s = Session.get("age"); console.log("age Session 改变,发生调用");//一旦age的值改变 这句话就会打印,因为它在testFunction中被调用了 return "call"}Template.testValue.testSessionChangeForValue = function () { return Session.get("name");};Template.testFunction.testSessionChangeForFunction = function () { demoFunctionWillCall() return "test Age";};
启动应用,打开浏览器控制台。可以看到demoFunctionWillNotCall
并没有执行,而demoFunctionWillCall
执行了一次,这很正常,因为模板渲染的时候被调用了。现在清空控制台。在控制台运行以下代码
Session.set("name","keepmoving");Session.set("age",999)
可以很明白的看到,结果如注释中所说一样。
因为Session是全局对象,在任何地方都可以调用,某个key值的改变,影响所有的引用它的Template或function。又因为在实际开发中,我们一般需要建立多js或者Template文件保证代码的整洁性,所以如果多处都使用了同一个Session的key,那么一旦这个key需要修改,那么它所影响的范围也很广,可能造成代码出错。因此尽量避免这多个js文件中使用同一个Sesion的key值。这个会对以后的修改带来便利。
由于Session是全局变量,所有的值都存在了同一个Session中,一旦你的key命名不规范,可能导致两个不同作用的key值 重叠造成值的非正确性。哪怕key的名称长一点多几个单词也没关系,得保证它的唯一性。因为所过Session.set方法也是可以修改key值的。由于个人有个人的习惯,那么我仅给出个人的使用经验。在命名方面如:
Session.set("_name_testValue","abc") //key+所用在的模板或者Session.set("_name_collectionName","abc") //key+所用在的Collection的名称等等,保证key是明确的,唯一的就行。
以上仅是简单说明的一些活性数据源,当然活性数据源不仅只有Session,Session的用处也不仅是Demo中的这点用法,以后在用到时会进行说明。
涉及代码下载地址:
或者到我的github : 目录下的Meteor/API-005查看