2016-08-01 76 views
2

我有以下可觀察的搜索引擎數組。MobX - 選擇數組中的單個項目,取消選擇所有其他項目?

@observable favoriteSearchEngine = [ 
    { 'provider' : 'google', 'selected': true }, 
    { 'provider' : 'yahoo', 'selected': false }, 
    { 'provider' : 'bing', 'selected': false }, 
]; 

用戶應該只能夠選擇在一個從UI時間。所以,如果他們選擇yahoo例如,雅虎將獲得selected: true和任何其他供應商將獲得selected: false

這個動作處理點擊:

@action onClickFavoriteSearchEngine = (provider) => { 
    alert(provider); // yahoo shows here 
    // How to do this step, only selected provider true and falsify all others in the array? 
} 

回答

2

通過@mweststrate給出的解決方案的偉大工程,但由於您使用的是action(這也是一個transaction)你可以取消選擇先前選擇的,並選擇新的,如果你願意的話:

@action onClickFavoriteSearchEngine = (provider) => { 
    alert(provider); // yahoo shows here 

    favoriteSearchEngine.forEach(e => e.selected = false); 
    favoriteSearchEngine.find(e => e.provider === provider).selected = true; 
} 
+1

作品在交易中很棒,謝謝Tholle! – Wonka

1

我會介紹一個可觀察的代表選擇,並從中選擇狀態來自:

@observable selection = null 
@observable favoriteSearchEngine = [ 
    { 'provider' : 'google', 'selected': function() { 
     return selection === this 
    } 
] 

如果你現在幾次指定另一個引擎的選擇,你會看到發動機的selected國家將根據更新ly

(N.B.如果宣佈一個普通的對象+推導這樣不使用箭頭功能,以避免問題與this

+0

沒有工作的原因,我仍然有興趣知道它會如何工作。 '@observable selection = null'你會做一個動作並指定'this.selection = provider'嗎?我試過但沒有工作。我不認爲我完全理解它是如何工作的:( – Wonka

+0

的確,你可能會創建一個小提琴來演示你的問題嗎?你可以例如fork:http://jsbin.com/qusoye/2/edit?html,css ,js,輸出 – mweststrate

+0

具體來說,分配如下內容:'favoriteSearchEngine [0]'(或更改計算屬性以匹配名稱而不是引用) – mweststrate

相關問題