2015-02-08 38 views
3

我知道您可以在獲取集合時關閉與reactive: false的反應性。如何在一個可以勝任的領域內完成與收集領域相同的工作?例如:關閉可控區域的反應性(流星)

Template.documentPage.events({ 
    'input .document-input': (function(e) { 
    e.preventDefault(); 

    content = $(e.target).html(); 
    Documents.update(this._id, { 
     $set: { 
     content: content 
     } 
    }); 
    } 
}); 

<template name="documentPage"> 
    <div class='document-input' contenteditable='true'>{{{content}}}</div> 
</template> 
+0

有趣的機會。自Blaze出來後,反應性通常對所有類型的輸入元素都可以正常工作,所以我猜它也適用於'contenteditable'。如果不是,那麼它可能很容易在流星代碼庫中修復。 – 2015-02-08 11:08:46

+0

@apendua Blaze複製'contenteditable'區域中的內容:https://github.com/meteor/meteor/issues/1964 – alexchenco 2015-02-09 07:05:43

回答

1

以反映例如助手或其他反應函數用Tracker.nonreactive(fn)包裝你的函數。請參閱:http://docs.meteor.com/#/full/tracker_nonreactive

+0

沒有奏效。我做了一些像'Tracker.nonreadtive(function(){return @content});'在'contenteditable'助手和流星拋出一個封閉的WebSocket錯誤。 – alexchenco 2015-02-10 05:51:52

+0

你能分享更多的代碼嗎?沒有看到整個畫面很難幫助你 – 2015-02-10 12:21:55

0

你可以在反應數據設置爲一個屬性,並將其移動到HTML中onRendered

<template name="documentPage"> 
    <div class='document-input' contenteditable='true' data-content='{{content}}'></div> 
</template> 

Template.documentPage.onRendered(function() { 
    var doc = this.find(".document-input"); 
    doc.innerHTML = doc.dataset.content; 
}); 

這樣數據內容屬性將被大火輸入沒有的文字更新元件。

安全注意:我改變了模板使用{{content}}代替{{{content}}},因此它可以通過流星轉義,但使用doc.innerHTML所以內容會在元素「轉義」。無論何時您從用戶輸入中呈現HTML,您都應該確保您正在對其進行消毒,以免在您的站點中打開xss漏洞。

另一種方法是使用一個庫像https://github.com/UziTech/jquery.toTextarea.js改變div的內容編輯成文本並使用doc.textContent代替doc.innerHTML刪除XSS