Vuejs 2 терминальные директивы или директивы с более высоким приоритетом? - PullRequest
0 голосов
/ 22 июня 2019

Я пытаюсь создать директиву автовивификации для моего приложения Vue.

То есть, если у моего data есть объект user, например, {user:{}} и я создаю следующий ввод:

<input type="text" v-model="user.info.name.first" v-autovivify>

Моя директива автоматически создаст желаемый путь внутри объекта пользователя, например, user.info.name.first (аналогично тому, как это работает в Angular 1.0)

Моя проблема в том, что до вызова моей директивы v-autovivify, v-model уже вычисляет и выдает ошибку:

[Vue warn]: Error in render: "TypeError: Cannot read property 'name' of undefined"

Но я точно знаю, что это можно сделать, потому что вот трюк, который я использую для автоживления объектов прямо сейчас:

Методы vivify просто создают вложенный объект и возвращают true

methods: {
   vivifyUser() {
        //this should of course check if the path exist but removed for brevity.
        this.user = {name: {first: {salut: ''}}};
        return true;
   }
   // other methods, etc...

Что это означает, что v-if вызывается до оценки v-model, и поэтому я могу создать путь, и не выдается никакой ошибки.

Итак, мой вопрос: как я могу установить приоритет моей директивы выше, чем v-model (точно так же, как v-if имеет приоритет)?

1 Ответ

2 голосов
/ 23 июня 2019

Добавьте v-if, чтобы задержать рендеринг элемента.

<input v-if='user.info' type="text" v-model="user.info.name.first" v-autovivify>

или даже более общий

<input v-if='user && user.info' type="text" v-model="user.info.name.first" v-autovivify>

Это общий шаблон, используемый при работе с асинхронными вычислениямисвойства.

...