/server
文件夾中的代碼只會在服務端運行/client
文件夾中的代碼只會在客戶端運行/lib
文件夾中的文件將被優先載入main.*
命名的文件將在其餘文件載入後載入/public
文件夾中定義一個模板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 () {
//模板被銷燬時候回調
});複製代碼
meteor中使用的數據庫是MongoDB
。
在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.methods
和Meteor.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");複製代碼