2017-07-03 61 views
2

所以,我的路線中有兩條路徑。我創建了兩條路線,分別爲doc recommendsEmber不會調用路由器的setupController

我的路由器是以下幾點:

// router.js 
Router.map(function() { 
    this.route('photos'); 
    this.route('photo', { path: '/photo/:photo_id' }); 
}); 

如果我首先參觀路線/照片/ ID,然後去/照片,它只會顯示在後者的對象。 (錯誤

如果我先訪問/照片,它會顯示所有對象,稍後我可以轉到/ photo/ID,這樣會很好。 (right

我想讓它工作在兩種方式。這個怎麼做?你可以看到我的代碼下面下來每條路線:

// photo.js 
export default Ember.Route.extend({ 
    model(params) { 
    return this.get('store').findRecord('photo', params.photo_id); 
    } 
}); 

// photos.js 
export default Ember.Route.extend({ 
    setupController(controller, model) { 
    let photos = this.get('store').findAll('photo'); 
    console.log('add all...'); 
    // convert to an array so I can modify it later 
    photos.then(()=> { 
     controller.set('photos', photos.toArray()); 
    }); 
    }, 
}); 

我可以隨時撥打findAll()功能無論在哪裏的用戶進入,但我不認爲這是聰明的。

我處理與頁面過渡方式:

要轉到照片我用:

{{#link-to 'photos'}}All{{/link-to}} 

要進入/照片/ ID我注入了服務「-routing」我用在一個事件點擊這樣的:

routing: Ember.inject.service('-routing'), 
actions() { 
    selectRow(row) { 
     this.get("routing").transitionTo('photo', [row.get('id')]); 
    } 
} 
+1

你是如何調用link-to進行過渡的?如果你提供'model'或任何對象,那麼它將不會調用模型鉤子和setupController掛鉤 – kumkanillam

+0

我會添加到問題,因爲它在評論中變得很奇怪 – mk2

+0

難道是因爲你沒有設置model()in photos.js因此你的模型沒有更新? – Cameron

回答

2

findAll會從商店得到它,並立即返回後它會請求服務器,並更新商店。但在你的情況下,因爲你沒有使用路由模型鉤子,所以這個活動數組將不會被更新,因此它不會在模板中反映出來。

如果我首先訪問路由/照片/ ID然後轉到/ photos,那麼 只會在後者上顯示一個對象。

在上述情況下,商店將只包含一個reocrd,所以當你使用findAll要求存儲數據將返回現有的單記錄。

另一種選擇是,
避免這種photos.toArray() - 這將打破現場陣列更新,我不知道你爲什麼在這裏需要它。因爲photosDS.RecordArray

注:需要注意的是DS.RecordArray不是一個JavaScript 陣列是很重要的,它是實現Ember.Enumerable的對象。這是 重要,因爲,例如,如果要通過 索引檢索記錄,[]符號將不起作用 - 您必須改用 objectAt(index)。

+2

太棒了!這工作!謝謝!我想我可能需要創建一件事來檢查所有數據是否已被插入,否則它將始終搜索所有照片,即使它們可能已在商店中 – mk2