[英]IronRouter get data in layout
我們有一個布局,需要在我們的控制器中定義的當前數據,如下所示:
TripController = RouteController.extend({
layoutTemplate: 'tripLayout',
data: function () {
return Trips.findOne({_id: this.params._id});
}
});
我們的問題似乎是數據競爭:
大多數時候Template.currentData()
是null,但有時(主要是在調試時)它是我們定義的data
。 問題只發生在我們在tripLayout中重新加載頁面時,而不是在我們從另一個頁面輸入行程布局時。
請注意,我們認為`TripController已加載,因為控制器參數已正確設置。
Template.tripLayout.onRendered(function() { // note, this is the layout template
Iron.controller.params._id // correct id
Template.currentData() // null
});
我們要實現的是分割布局,其中右側始終相同,左側由yield填充(參見屏幕截圖)
更新 (此更新錯誤)
我想我發現了錯誤:
waitOn: function () {
return [Meteor.subscribe('public-trips'),
Meteor.subscribe('my-trips')];
}
一旦我刪除了數組(所以只有一個訂閱),
data: function () {
return Trips.find({}).fetch();
}
不再返回0。 我會再研究一下。
UPDATE2
所以我最初的假設是錯誤的,訂閱只有一個沒有幫助。 這真的只是一場競爭。
UPDATE3
我設法重現它: meteorpad
在警報中,它顯示了它擁有的玩家數量。 第一次它是0然后是6.但是0應該不會出現,因為我們'waitOn'它?!
我們設法解決了“問題”(這是預期的行為,但我們找到了解決方法)! 詳情請訪問https://github.com/iron-meteor/iron-router/issues/1464#issuecomment-158738943 :
好的,這是我們如何解決這個問題:
第一個重要的是要包含動作函數,如下所示:
action: function() { if (this.ready()) { this.render(); } }
這幾乎適用於所有事情,但我們仍有一些問題。 在我們的例子中,它是關於使用yield不呈現的模板,因此不受Iron Router的控制。 將這些切換到內容區域(使用{{yield'contentRegionName'}}),然后在動作函數中顯式渲染它們,如下所示:
action: function() { if (this.ready()) { this.render(); this.render('contentRegionTemplate', {to: 'contentRegionName'}); } }
你需要這些動作函數,因為waitOn只意味着那里定義的潛艇將被添加到等候名單,但不會等待等待候補名單。 從本質上講,現在發生的事情是,由於反應性,您的動作函數被調用兩次,並且模板僅在數據准備好后才會呈現。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.