[英]Why can't I pass a string as the data argument to Blaze.renderWithData()?
我正在通過以下調用創建Blaze視圖:
Blaze.renderWithData(Template.my_template, myobj._id, html.node());
my_template
看起來像這樣:
<template name="my_template">
{{> Template.dynamic template=whichTemplate data=sdata}}
</template>
sdata幫助器如下所示:
sdata: function() {
return Doodads.findOne({_id: this});
}
失敗並顯示以下錯誤:
模板助手中的異常:TypeError:selKey.substr不是函數
如果我在該幫助器中執行console.log(this)
,則會得到:
String {0: "N", 1: "7", 2: "j", 3: "o", 4: "y", 5: "g", 6: "w", 7: "P", 8: "g", 9: "e", 10: "s", 11: "R", 12: "f", 13: "w", 14: "q", 15: "o", 16: "7", length: 17, [[PrimitiveValue]]: "N7joygwPgesRfwqo7"}
若要更正此問題,我可以將findOne()
行更改為:
return Doodads.findOne({_id: ""+this});
哪個按預期工作。
我發布這個問題是為了幫助自己(和其他人)了解這里發生的情況。
我主要想知道:
String{...}
對象和常規字符串之間會有區別(即,當我使用其他/奇怪的選擇器值時,為什么選擇器鍵對象沒有substr()
方法) ? _id
屬性顯示為這個奇怪的String{...}
對象作為模板數據, this
時候_id
屬性通常只是一個字符串? 還是不是通常,而我只是從未注意到? 我已經使用""+this
hack解決了問題,但是還有更合適的方法嗎?
如果您的數據是從Meteor訂閱之外的其他來源創建的,則可能是您的_id是MongoDB ObjectId,而不是字符串。
如果您在myobj
對象上執行.findOne,那么請看一下Mongo shell,它看起來像
"_id" : ObjectId("57cd946429bca10300f0fd55")
根據Blaze API文檔 ,簽名為:
Blaze.renderWithData(templateOrView, data, parentNode, [nextNode], [parentView])
數據 對象或功能
要使用的數據上下文,或者返回數據上下文的函數。 如果提供了功能,它將以反應方式重新運行。
在您的情況下,數據上下文應該是一個對象,其中包括whichTemplate
屬性和可以在助手中使用的一些id
。
Blaze.renderWithData(Template.my_template, {
_id: myId,
whichTemplate: someTemplateName
}, someNode);
或者,而不是數據對象,傳遞一個將以反應方式重新運行的函數。
使用此設置,您的幫助程序代碼應類似於:
sdata: function() {
return Doodads.findOne(this._id);
}
如果您對所導致的錯誤原因感興趣,請執行以下操作:
Function.protptype.apply(thisArg, [argsArray])
使用Function.protptype.apply(thisArg, [argsArray])
(在此行中 )將countext綁定到模板助手的this
引用。
根據EcmaScript標准,如果thisArg
是基元,則將其裝箱。
thisArg
此值提供給有趣的調用。 請注意,這可能不是該方法看到的實際值:如果該方法是非嚴格模式代碼中的函數,則null和undefined將被全局對象替換, 原始值將被裝箱 。
(來源: MDN )
這會導致將沒有substr
方法的String
對象傳輸到MiniMongo.Collection
的find()
方法,該方法在此處失敗 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.