Meteor筆記

Meteor

Meteor應用的文件結構

  • /server文件夾中的代碼只會在服務端運行
  • /client文件夾中的代碼只會在客戶端運行
  • 其餘代碼則同時運行於服務端和客戶端
  • /lib文件夾中的文件將被優先載入
  • 全部以main.*命名的文件將在其餘文件載入後載入
  • 全部靜態資源文件放在/public文件夾中

Blaze模版

定義一個模板javascript

<template name="xx1"> //xx命名必需要惟一
 ...
</template>複製代碼

引用一個模板html

{{> xx1}}複製代碼

相互嵌套java

<template name="xx1"> //xx命名必需要惟一
 {{> xx2}}
</template>複製代碼

條件mongodb

{{#if true}}
    <p></p>
 {{else}}
    <p></p>
 {{/if}}複製代碼

遍歷數據庫

{{#each arry}}
   <p>{{name}}---{{age}}</p>
 {{/each}}


arry:function () {
 return [{name:'11'},{age:22},{name:'11'},{age:22}]
}複製代碼

上下文服務器

模板動態數據業務邏輯helpers,有關一些動態數據的判斷都寫在helpers對象中dom

局部:僅僅在xxx模板中起做用函數

Template.xxx.helpers({
 ...
});複製代碼

全局:任意模板中均可以調用該變量this

Template.registerHelper('變量名',(a,b)=>{
  return a===b;
});

某模板內:
<input type="checkbox" checked={{變量名 select 'yes'}}>
Template.xxx.helpers({
  select:'yes'
});複製代碼

事件綁定
模板內置了jQuery,也就是說平時咱們在前臺操做的dom,轉在了後臺寫。spa

Template.xx.events({
  "click button":function(event,template){
      ...
  },
  "mouseenter #myid":function(event,template){
      ...
  }
});複製代碼

模板的生命週期

Template.xxx.onCreated(function(){
  //模板的實例化完成,可是還看見,適合設置初始化的變量
  this.haha='123'; //設置初始化變量 ,想在helpers和events函數中獲取到此變量使用Template.instance().haha;
});

Template.xxx.onRendered(function () {
  //dom已經在頁面存在,用戶能夠看見了,須要用js操做dom就在此步進行操做
});

Template.xxx.onDestroyed(function () {
  //模板被銷燬時候回調
});複製代碼

MongoDB

meteor中使用的數據庫是MongoDB

  • collection介紹

在mongodb中,collection至關於關係型數據庫的表,但並不需提早建立,更不須要預先定義字段。
db.collect1.save({username:’mayj’,mail:’test@abc.com’})#向collect1中插入一條記錄,collection會在第一次插入記錄的時候自動建立。
db.collect1.save({username:’name2’,mail:’name2@abc.com’,age:28})#插入一條新記錄,相對上條記錄此次有三個key,相似三個字段。
db.collect1.find();#列出collect1中的全部記錄。

在Meteor中建立一個新的collection使用:MyCollection = new Mongo.Collection("my-collection");,爲了讓這個Collection(我叫作集合吧)能在服務器和客戶端使用,寫在判斷客戶端仍是服務器端的外面。
寫好以後修改以前的JS,helper中返回集合的數據:

Tasks = new Mongo.Collection("tasks");
if (Meteor.isClient) {
  // This code only runs on the client
  Template.body.helpers({
    tasks: function () {
      return Tasks.find({});
    }
  });
}複製代碼

Meteor可使用的數據庫操做API

find,findOne,insert,update,upsert,remove,allow,deny

insecure包

模擬每一個客戶端對服務器上的數據庫擁有徹底讀/寫權限的效果,一般生產環境須要移除這個包meteor remove insecure
這時若是建立一個清單,會發現多出一個清單又瞬間回到原樣了,控制檯顯示update failed: Access denied,這就是延遲補償:客戶端上使用預讀和模式模擬技術,使它看起來與數據庫的鏈接是零延遲的
去掉了insecure包,須要修改代碼

  • 方法一
// server
Tasks.allow({
    update: function(userId,doc,fieldNames,modifier){
        return true;
    }
});複製代碼

若是返回true,容許客戶端執行update操做,false時拒絕,也可使用collection.deny方法來拒絕客戶端修改數據庫的請求。只有在客戶端試圖修改數據時纔會觸發,而服務器端不受這個限制

  • 方法二 經過Meteor.methodsMeteor.call的組合來實現客戶端修改數據
//server
Meteor.methods({
    insert:function(task){
      Tasks.insert(task);
    }
});

//client
Template.task.events({
    'click .add': function () {
      Meteor.call('insert',{name:'Lin',skill: 'JS'});
    }
});複製代碼

autopublish包

使用autopublish包,Meteor會客戶端Minimongo中的內容和服務器端的MongoDB同步(除了users集合部分的內容和索引)一般生產環境也須要移除這個包meter remove autopublish

這時候客戶端和服務器端的數據庫就不一樣步了,假如咱們有多個集合,能夠選擇性地從服務器端發佈,而後從客戶端訂閱

//server
Meteor.publish("task",function(){
    return Tasks.find();
});

//client
Meteor.subscribe("task");複製代碼
相關文章
相關標籤/搜索