簡體   English   中英

為什么不能將字符串作為數據參數傳遞給Blaze.renderWithData()?

[英]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.Collectionfind()方法,該方法在此處失敗

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM