原文:http://danneu.com/posts/6-meteor-tutorial-for-fellow-noobs-adding-features-to-the-leaderboard-demo/

PS:本人英文水平有限,请多见谅。

--------------------------------

Meteor 是一个刚开始的javascript 框架。它的视频演示告诉我们可以很容易的建立Web实时应用,不需要学习更多专门的概念技术就可以实现像“实时”这一特性。这个有趣、且全新而流行的框架吸引着人们去试一试。

当时在 Hacker News submission 上有超过1100张头片宣告它的启动。

积分榜样例

我会添加一些新特性在 排行榜 这个应用上。

  1.添加用户的表单

  2.一个按钮去移除已有用户

  3.新用户名字验证

你按照下面命令可以安装Meteor 并生成积分榜样例

 $ curl install.meteor.com | sh
 $ meteor create --example leaderboard
 $ cd leaderboard
 $ meteor 

一、添加用户的表单

我会写一个简单的表单用来添加新用户

首先,我写了一个新模板,模板包含一个文本输入框和一个按钮。

 <!-- leaderboard.html -->
 <template name="new_player">
   <div class="new_player">
     <input id="new_player_name" type="text" />
     <input type="button" class="add" value="Add Player" />
   </div>
 </template>

注意:  由于有一个Meteor团队待修正的BUG,  div 的容器是必须的因为事件选择不会工作在顶层元素。我抓狂了很久去找为什么我的点击事件没有反应。

把这几行代码放在 leaderboard 后面,并在leaderboard里加入:

 <!-- leaderboard.html -->
 <template name="leaderboard">
   ...

   {{> new_player}}

 </template>

现在给按钮添加事件绑定.

 // leaderboard.js
 Template.new_player.events = {
   'click input.add': function () {
     var new_player_name =     document.getElementById("new_player_name").value;
     Players.insert({name: new_player_name, score: 0});
   }
 };

注意这个事件是绑定在在刚写的模板名称域内的。

当“Add Player”按钮点击后,获取ID为#new_player_namer的文本框的值,并将该用户积分设为0,最后把它插入到用户集合(数据库)中。

你会注意到,它在Javscript文件的顶部声明。

 // leaderboard.js
 Players = new Meteor.Collection("players");

响应

当所绑定的模板引用发生变化,Meteor事件句柄会自动更新DOM。

主要理解这几点:

(1)这几个 Meteor 函数会在自动更新上下文会调用

  • Meteor.ui.render and Meteor.ui.chunk
  • Meteor.autosubscribe
  • Templates

(2)更新的数据源会触发如下变化:

  • Session variables
  • Database queries on Collections
  • Meteor.status

换句话说:

1、Meteor会自动更新模板

2、改变用户集合(数据库)将会自动触发重绘(更新模板)。

在验证用户的信息时,需要用到 Session 注意变量去通知错误信息的更新

二、移除用户

界面就像这个样子

我们把按钮添加在 player 模板上,player 模板会被循环遍历去创建用户列表。

 <!-- leaderboard.html -->
 <template name="player">
  <div class="player ">
     <input type="button" value="X" class="delete" /> <!-- here it is -->
      <span class="name"></span>
      <span class="score"></span>
   </div>
 </template>

下面要接着做的就是添加一个点击事件绑定在按钮上,用于移除数据库集合中指定的用户。

 // leaderboard.js
 Template.player.events = {
  'click input.delete': function () { // <-- here it is
    Players.remove(this._id);
  },
  'click': function () {
     Session.set("selected_player", this._id);
  }
 };

三、新用户的信息验证

对于Meteor尚未成熟的主要问题是缺乏安全保障,即客户端可以对数据库进行任意操作。然而,对于处于预览版的Meteor,这点确实是个大问题。不过,Meteor创建人已经说明过会解决这一问题。

对新用户名采取2个验证规则:

1. 不能为空

2. 不存在集合(数据库)中

当验证失败时,错误信息会显示在输入框前:

添加错误信息进 “new_player” 模板

 <!-- leaderboard.html -->
 <template name="new_player">

   <span id="error" style="color: red;">{{error}}</span>

   <div class="new_player">
     <input id="new_player_name" type="text" />
     <input type="button" class="add" value="Add Player" />
   </div>
 </template>

例子中,我们设定 “Template.new_player.error” 返回 undefined 或者错误信息。

对于模板的自动更新响应,它需要上述更新部分的数据源(如template.xxxx.xxxs)。

例子中错误信息使用 Session来存储,命名为 error 。在浏览器console中,测试Session

 >>> Session.keys
 Object { }

 >>> Session.set("error", "Name can't be blank");
 >>> Session.keys
 Object { error="Name can't be blank" }

 >>> Session.get("error");
 "Name can't be blank"

 >>> Session.set("error", undefined)
 >>> Session.keys
 Object { }

这里是 Session API Doc

与模板中对应,绑定error 信息

// leaderboard.js
Template.new_player.error = function () {
    return Session.get("error");
};

使用Validation 对象:

下面是几个简单的API:

  a) Validation.clear() 会清除 Session 中错误信息 ( undefined )

  b) Validation.set_error(message) 保存并显示错误信息

  c) Validation.valid_name(name)  返回 ture 或 false,如果ture,清除错误信息,否则显示错误

  d) Validation.player_exists(name) 如果集合中存在 name,返回 ture, 否则 返回 false

下面是Validation 对象的定义:

 // leaderboard.js
 var Validation = {
     clear: function() {
         return Session.set("error", undefined);
     },
     set_error: function(message) {
         return Session.set("error", message);
     },
     valid_name: function(name) {
         this.clear();
         if (name.length == 0) {
             this.set_error("Name can't be blank");
             return false;
         } else if (this.player_exists(name)) {
             this.set_error("Player already exists");
             return false;
         } else {
             return true;
         }
     },
     player_exists: function(name) {
         return Players.findOne({
             name: name
         });
     }
 };

在插入用户前需要验证,即将验证放在“Add Player ”点击事件上:

     Template.new_player.events = {
         'click input.addPlayer': function() {
             var newPlayerName = document.getElementById('new_player_name').value.trim();

             if (Validation.valid_name(newPlayerName)) {
                     Players.insert({
                     name: newPlayerName,
                     score: 0
                 });
             };
         }
     };

注意:在验证之前,用户名先清除多余空格。

结语:

  我认为这已经够了。

  我晚些会更新这篇文章,添加更多特性,并且寻找javascript最佳实践。

  原文:http://danneu.com/posts/6-meteor-tutorial-for-fellow-noobs-adding-features-to-the-leaderboard-demo/

【译】Meteor 新手教程:在排行榜上添加新特性的更多相关文章

  1. Linux上添加新硬盘的实例介绍

    在Linux上添加新硬盘的实例讲解,有需要的朋友可以看看. 系统:Redhat AS3 UP3硬盘:scsi注意:# 表示是root用户执行的命令 [root@cncmail data1]# fdis ...

  2. [转]Magento2开发教程 - 如何向数据库添加新表

    本文转自:https://www.cnblogs.com/xz-src/p/6920365.html Magento 2具有特殊的机制,允许你创建数据库表,修改现有的,甚至添加一些数据到他们(如安装数 ...

  3. Magento2开发教程 - 如何向数据库添加新表

    Magento 2具有特殊的机制,允许你创建数据库表,修改现有的,甚至添加一些数据到他们(如安装数据,已被添加在模块安装). 这种机制允许这些变化可以在不同的设备之间传输. 关键的概念是,而不是做你能 ...

  4. [译].Net 4.5 的五项强大新特性

    本文原文:Five Great .NET Framework 4.5 Features 译者:冰河魔法师 目录 介绍 特性一:async和await 特性二:Zip压缩 特性三:正则表达式执行超时 特 ...

  5. ASP.NET 5系列教程 (一):领读新特性

    近期微软发布了ASP.NET 5.0,本次发布的新特性需求源于大量用户的反馈和需求,例如灵活的跨平台运行时和自主部署能力使ASP.NET应用不再受限于IIS.Cloud-ready环境配置降低了云端部 ...

  6. 前端笔记之HTML5&CSS3(上)新特性&音频视频&本地存储&自定义属性

    一.HTML5简介 HTML 5 的第一份正式草案已于2008年1月22日公布.HTML5 仍处于完善之中.然而,大部分现代浏览器已经具备了某些 HTML5 支持. 2014年10月29日,万维网联盟 ...

  7. 【译】Unity3D Shader 新手教程(6/6) —— 更好的卡通Shader

    本文为翻译,附上原文链接. 转载请注明出处--polobymulberry-博客园. 动机 如果你想了解以下几件事,我建议你阅读以下这篇教程: 想知道如何写一个multipass的toon shade ...

  8. SQL Server 分区表上建立ColumnStore Index 如何添加新分区方法与步骤

    在生产环境中会遇到这样的场景,一个表随着时间的推移,越来越大,这个时候我们开始动手为这个表建立分区来改进查询性能. 但是表过大上百个G的时候,在数据仓库中,为了改进查询性能,我们可以添加在分区表的基础 ...

  9. 线上nginx 平滑添加新模块;如(--with-http_realip_module)

    nginx 添加模块1.查看当前nginx信息(配置文件路径,启动用户...) ps aux | grep nginx 2.查看当前nginx已启用的模块(记录模块信息,安装路径)./nginx -V ...

随机推荐

  1. react组件的生命周期

    写在前面: 阅读了多遍文章之后,自己总结了一个.一遍加强记忆,和日后回顾. 一.实例化(初始化) var Button = React.createClass({ getInitialState: f ...

  2. 前端css兼容性与易混淆的点

    一.常用的骨灰级清除浮动 .clearfix:after { content: "."; display: block; height:; clear: both; visibil ...

  3. expect用法

    1. [#!/usr/bin/expect]  这一行告诉操作系统脚本里的代码使用那一个shell来执行.这里的expect其实和linux下的bash.windows下的cmd是一类东西.  注意: ...

  4. macOS 我的装机

    最近多次配置 Mac 的开发环境,稍微记录一下 1 创建无付费信息的Apple ID 2 Xcode ​ gem 源更改 3 Alfred 4 微信 5 SourceTree 6 Sublime Te ...

  5. ExtJS 4.2 Grid组件的单元格合并

    ExtJS 4.2 Grid组件本身并没有提供单元格合并功能,需要自己实现这个功能. 目录 1. 原理 2. 多列合并 3. 代码与在线演示 1. 原理 1.1 HTML代码分析 首先创建一个Grid ...

  6. OpenCASCADE BRep Projection

    OpenCASCADE BRep Projection eryar@163.com 一网友发邮件问我下图所示的效果如何在OpenCASCADE中实现,我的想法是先构造出螺旋线,再将螺旋线投影到面上. ...

  7. ASP.NET Core应用针对静态文件请求的处理[4]: DirectoryBrowserMiddleware中间件如何呈现目录结构

    和StaticFileMiddleware中间件一样,DirectoryBrowserMiddleware中间本质上还是定义了一个请求地址与某个物理目录之间的映射关系,而目标目录体现为一个FilePr ...

  8. java 设计模式

    目录: 设计模式六大原则(1):单一职责原则 设计模式六大原则(2):里氏替换原则 设计模式六大原则(3):依赖倒置原则 设计模式六大原则(4):接口隔离原则 设计模式六大原则(5):迪米特法则 设计 ...

  9. BI分析受阻?FineBI推出SPA螺旋式分析新功能!

    过去,企业级的数据分析通常会有这么几种场景,业务部门托信息部门分析数据,结果报表一出,唇枪舌剑争论你我高低,数据不准,指标不对.信息部门欠缺业务概念,业务部门不懂技术逻辑,数据分析之路,暂时搁浅. 后 ...

  10. MySQL:Fabric 安装

    MySQL Fabric安装 MySQL Fabric是Oracle提供的用于辅助进行ha\sharding的工具,它的基本架构: 从上面看出,借助于Fabric, 可以搭建 HA 集群.Sharin ...