簡體   English   中英

IronRouter在布局中獲取數據

[英]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.

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