2016-08-01 55 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

相关问题