Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vue.js/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Firebase Vuexfire将Firestore集合绑定到对象而不是列表_Firebase_Vue.js_Google Cloud Firestore_Vuefire_Vuexfire - Fatal编程技术网

Firebase Vuexfire将Firestore集合绑定到对象而不是列表

Firebase Vuexfire将Firestore集合绑定到对象而不是列表,firebase,vue.js,google-cloud-firestore,vuefire,vuexfire,Firebase,Vue.js,Google Cloud Firestore,Vuefire,Vuexfire,我的Firestore数据库中有以下集合: 我可以使用以下内容将其绑定到vuex存储: 状态:{ 资产:[], }, 行动:{ bindAssets:firestoreAction({bindFirestoreRef})=>{ 返回bindFirestoreRef('assets',db.collection('assets')) }), }, 但是,这会将它们作为列表绑定到资产,即 [ {id:“id1”/*etc.*/}, {id:“id2”/*etc.*/}, {id:“id3”/*e

我的Firestore数据库中有以下集合:

我可以使用以下内容将其绑定到vuex存储:

状态:{
资产:[],
},
行动:{
bindAssets:firestoreAction({bindFirestoreRef})=>{
返回bindFirestoreRef('assets',db.collection('assets'))
}),
},
但是,这会将它们作为列表绑定到
资产
,即

[
{id:“id1”/*etc.*/},
{id:“id2”/*etc.*/},
{id:“id3”/*etc.*/},
]
如果是,我希望它被绑定为:

{
“id1”:{/*etc.*/},
“id2”:{/*etc.*/},
“id3”:{/*etc.*/},
}

如何实现这一点?

如果要转换对象中的
资产
数组(通过绑定
资产
集合获得),如下所示

{
  "id1": { /* etc. */ },
  "id2": { /* etc. */ },
  "id3": { /* etc. */ },
}
以下Vuex getter应该可以实现这一点:

state: {
  assets: [],
},

actions: {
  bindAssets: firestoreAction(({ bindFirestoreRef }) => {
    return bindFirestoreRef('assets', db.collection('assets'))
  }),
},

getters: {
     assetsObj: state => {

         const arrayToObject = (array) =>
            array.reduce((obj, item) => {
                 obj[item.id] = item
                 return obj
            }, {})

        return arrayToObject(state.assets)

    }
}

更新以下评论(在聊天室中): 如果只想绑定到一个文档,则应使用
bindAssetDoc
assetDoc
执行以下操作

商店

state: {
    assets: [],
    assetDoc: null
},

mutations: vuexfireMutations,

actions: {
    bindAssetDoc: firestoreAction(({ bindFirestoreRef }, payload) => {
        return bindFirestoreRef('assetDoc', db.collection('assets').doc(payload.id))
    }),
    bindAssets: firestoreAction(({ bindFirestoreRef }) => {
        return bindFirestoreRef('assets', db.collection('assets'))
    })
}
通过
/asset/:assetId打开的组件

<script>
//...
export default {
  created() {
    console.log('OK1');
    this.$store
      .dispatch('bindAssetDoc', { id: this.$route.params.assetId });
  }
};
</script>

//...
导出默认值{
创建(){
console.log('OK1');
这是一家$1的商店
.dispatch('bindAssetDoc',{id:this.$route.params.assetId});
}
};

这很奇怪。我试图重现您的案例,结果是
资产
数组是一个与
data()
方法对应的对象数组,即没有任何
.key
属性。您使用的是特定的设置吗?@RenaudTarnec这是一个只读属性,如本文所述:我只是将其添加到示例中,以表明它确实存储了密钥,只是没有以我想要的形式存储。我试图了解如何获得此
[{.key:“id1”/*etc.*/},…
数组。你能分享一下用来获取它的代码吗?@RenaudTarnec我刚刚手写了那部分。但是你只需要记录一个getter,返回
state.assets
@RenaudTarnec,就可以得到它。事实上,我确实输入了一个错误。默认情况下,它是“id”而不是“.key”(我已经更新了我的问题)