2012-10-15 44 views
0

在此閱讀有關不同Spark註釋類型的信息:https://github.com/meteor/meteor/wiki/Spark在Spark中,Landmark和Branch Label之間有什麼區別?

我仍然對需要放置地標和分支標籤的位置感到困惑。兩者之間的區別是什麼,Handlebars什麼時候打電話給他們?我是Blade templating engine的作者,我正在嘗試將Blade與Spark整合。

+0

這是我blake https://groups.google.com/forum/?fromgroups#!forum/meteor-core試試這個地方。 – crapthings

回答

1

在把手中,每個模板和每個{{#constant}} ... {{/ constant}}區域都包裹着一個地標。當DOM的某個區域被反應性地更新時,爲了DOM保存,生命週期回調(創建/銷燬)和地標本地狀態的目的,舊地標和新地標被匹配。

地標由包含它們的分支標籤形成的「路徑」標識。 (地標本身對路徑沒有貢獻。)具有相同路徑的兩個地標是非法的。計算標籤區域內的HTML或函數參數主體中的標誌位到labelBranch或createLabel中的HTML也很重要。這是因爲當你調用這些函數時,Spark實際上已經與DOM匹配,因此它在運行之前知道是否調用「已創建」(因爲這是一個新的標誌)或不是(因爲它是舊的重新渲染)計算HTML的函數。

把手在幾個地方調用labelBranch來區分應該區分的任何模板(地標)調用。基本上,標籤應該確定導致模板調用的「調用棧」。模板源({{> someTemplate}})中的每個模板調用都會獲取一個標籤,並且還會循環使用循環,根據所討論對象的_id或某些其他啓發式方法標記循環的每個迭代,如果沒有。 (請注意,Meteor模板中有兩個代碼路徑用於循環,一個用於數據庫中的可觀察遊標,另一個用於其他所有內容(如普通陣列)。)

在包含「foo」模板的模板的幾個片段中,有幾個時間,「富」(包括循環的每個迭代)的每個調用都在不同的分支標籤內完成:

{{> foo}} 
{{> foo}} 
{{#each collection}} 
    {{> foo}} 
{{/each}} 
{{> foo}} 

如果一個幫手直接調用模板的功能呢?

var myHelper = function() { 
    return Template.foo() + " " + Template.bar(); 
} 

在這種情況下,這一天被保存,因爲模板包也包每個模板像「Template.foo」或「Template.bar」標籤(標籤很便宜)。但是,如果助手多次用不同的參數調用相同的模板,將會出現重複的標誌性問題;在這種情況下,由助手來放棄額外的分支標籤以消除歧義。

由模板包(在deftemplate.js中)生成的Template.foo的實現使用以下從外部到內部的嵌套註釋:標籤,數據,地標,事件,隔離。這個順序相當有限。例如,封裝事件註釋的地標用於查找數據。隔離註釋是故意在內部的。

對於添加額外的模板包,手柄和模板包的當前因子分解可能並不太好!這對我們來說是一個新的前沿。不過,我們對使用更多模板語言非常感興趣,並且很高興您正在處理這個問題。

相關問題