Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/449.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
Javascript VueJS自动创建嵌套对象属性以简化代码 关于这个问题的一些背景知识_Javascript_Vue.js - Fatal编程技术网

Javascript VueJS自动创建嵌套对象属性以简化代码 关于这个问题的一些背景知识

Javascript VueJS自动创建嵌套对象属性以简化代码 关于这个问题的一些背景知识,javascript,vue.js,Javascript,Vue.js,我已经构建了一个自定义系统来自动监视来自nosql数据库JSON的一些存储属性。没有什么太复杂的,除了嵌套所需的几个原因,这里没有讨论对象 数据结构如下所示: { store: { objA: { objB: { prop1: 'some value' } } } } 但是,由于它是一个提供存储属性的nosql数据库,所以从数据库加载之后,objB可能就不存在了 使用

我已经构建了一个自定义系统来自动监视来自nosql数据库JSON的一些存储属性。没有什么太复杂的,除了嵌套所需的几个原因,这里没有讨论对象

数据结构如下所示:

{
    store: {
        objA: {
            objB: {
                prop1: 'some value'
            }
        }
    }
}
但是,由于它是一个提供存储属性的nosql数据库,所以从数据库加载之后,objB可能就不存在了

使用的模板示例 我有一些自定义组件,它们的道具直接绑定到数据存储

<my-selector :value.sync="store.objA.objB.prop1">
</my-selector>
但是,当objB不存在时,它会崩溃,通常会出现javascript错误,表示它无法获取未定义的objB,但这是正常的

我正试图找到一种vuejs方法来为我准备数据

思想 为了应对这场崩溃:

在这种情况下,我不能使用v-if来屏蔽选择器。因为即使数据尚未设置,也可以使用该选择器示例:用于可选数据。 我可以修复从数据库获取数据的load函数,以便在将数据分配给数据存储之前初始化所需的属性,如objB。但是,这意味着我的初始VueJS数据对象也将包含这些必需的属性。如果我找不到任何替代解决方案,我可能会使用它,但我认为这不是最简单的方法,因为我必须在分配任务之前修复任何传入的数据。 我的首选是在模板中创建一个指令或任何其他构建的东西,如果缺少它们,可以为我添加它们。 VueJS始终计算绑定值 我想到了这个解决方案:

<my-selector v-autocreate="'store.objA.objB.prop1'" :value.sync="store.objA.objB.prop1">
</my-selector>
但是,指令绑定v-autocreate不会首先通过调试器检查。 我没有找到与指令或属性加载顺序相关的文档

我还希望使用bind指令获得节点的所有绑定 函数以避免重复字符串,但似乎我们无法获得我用于knockoutjs的信息,在这里,我们可以选择分配给节点的所有绑定,以实现不同的行为

我想达到这个目标,但我不确定我是否可能需要指令上的pre-bind/beforeBind事件,哈哈:

<my-selector v-autocreate :value.sync="store.objA.objB.prop1">
</my-selector>

其中v-autocreate将确保执行vm。$缺少的属性集。

您可以创建一个方法来检查对象路径中的每个属性,如果不存在则创建它,然后返回最后一个属性的值

未测试的示例:

get(object, path) {
    path = path.split('.')

    let index = 0
    const length = path.length
    let val
    while (object != null && index < length) {
        let key = path[index++]
        if(object[key] == null) {
            this.$set(object, key, {})
        }
        object = object[key]
    }
    return val
}
用法:

<my-selector :value="get(store,'objA.objB.prop1')">
</my-selector>
您可能对lodash的get函数感兴趣,这就是代码示例的基础


你能让你的组件使用默认的道具值吗。。。问题不在于数据的验证,而是Webpack vue-template-es2015-compiler在尝试在属性内使用方法时崩溃。所以它不起作用。我不知道它是否适用于纯VueJs,但我想使用.vue文件+网页包。