Проблема с запуском кода Vue в Nuxt SPA (конфликт vmodel на одном элементе) - PullRequest
0 голосов
/ 18 октября 2018

У меня проблема с запуском рабочего кода в приложении nuxt.Мое приложение nuxt настроено как SPA.

Это кодовая ручка, которая работает.https://codepen.io/jjelic/pen/yevNLZ

Когда я добавляю это в свой файл filters / index.vue, я получаю сообщение об ошибке

value = "row.qty * row.price | currencyDisplay" конфликтует с v-моделью натот же элемент, поскольку последний уже расширяется до привязки значения внутри

  • : value = "row.qty * row.price * row.tax / 100" конфликтует с v-моделью для того же элемента, посколькупоследний уже расширяется до привязки значений внутри
  • Элемент списка

Как получается, что этот кодекс работает онлайн, но с Vue / nuxt существует конфликт с Vmodel?Есть ли обходной путь, который я могу использовать для решения этой проблемы?

Мой код

Vue.filter('currencyDisplay', {
// model -> view
read: function (val) {
    if (val > 0) {
        return accounting.formatMoney(val, "$", 2, ".", ",");
    }
},
// view -> model
write: function (val, oldVal) {
    return accounting.unformat(val, ",");
}
});

Vue.directive('sortable', {
twoWay: true,
deep: true,
bind: function () {
    var that = this;

    var options = {
        draggable: Object.keys(this.modifiers)[0]
    };

    this.sortable = Sortable.create(this.el, options);
    console.log('sortable bound!')

    this.sortable.option("onUpdate", function (e) {
        that.value.splice(e.newIndex, 0, that.value.splice(e.oldIndex, 1)[0]);
    });

    this.onUpdate = function(value) {
        that.value = value;
    }
},
update: function (value) {
    this.onUpdate(value);
}
});

var vm = new Vue({
el: '#app',
data: {
    rows: [
        //initial data
        {qty: 5, description: "Something", price: 55.20, tax: 10},
        {qty: 2, description: "Something else", price: 1255.20, tax: 20},
    ],
    total: 0,
    grandtotal: 0,
    taxtotal: 0,
    delivery: 40
},
computed: {
    total: function () {
        var t = 0;
        $.each(this.rows, function (i, e) {
            t += accounting.unformat(e.total, ",");
        });
        return t;
    },
    taxtotal: function () {
        var tt = 0;
        $.each(this.rows, function (i, e) {
            tt += accounting.unformat(e.tax_amount, ",");
        });
        return tt;
    }
},
methods: {
    addRow: function (index) {
        try {
            this.rows.splice(index + 1, 0, {});
        } catch(e)
        {
            console.log(e);
        }
    },
    removeRow: function (index) {
        this.rows.splice(index, 1);
    },
    getData: function () {
        $.ajax({
            context: this,
            type: "POST",
            data: {
                rows: this.rows,
                total: this.total,
                delivery: this.delivery,
                taxtotal: this.taxtotal,
                grandtotal: this.grandtotal,
            },
            url: "/api/data"
        });
    }
}
});

<code>    <template>

      <div class="panel-body" id="app">
        <table class="table table-hover">
            <thead>
            <tr>
                <th style="width: 20px;">No.</th>
                <th>Description</th>
                <th style="width: 80px;">Qty</th>
                <th style="width: 130px;" class="text-right">Price</th>
                <th style="width: 90px;">Tax</th>
                <th style="width: 130px;">Total</th>
                <th style="width: 130px;"></th>
            </tr>
            </thead>
            <tbody v-sortable.tr="rows">
            <tr v-for="row in rows" track-by="$index">
                <td>
                    {{ $index +1 }}
                </td>
                <td>
                    <input class="form-control" v-model="row.description"/>
                </td>
                <td>
                    <input class="form-control" v-model="row.qty" number/>
                </td>
                <td>
                    <input class="form-control text-right" v-model="row.price | currencyDisplay" number data-type="currency"/>
                </td>
                <td>
                    <select class="form-control" v-model="row.tax">
                        <option value="0">0%</option>
                        <option value="10">10%</option>
                        <option value="20">20%</option>
                    </select>
                </td>
                <td>
                    <input class="form-control text-right" :value="row.qty * row.price | currencyDisplay" v-model="row.total | currencyDisplay" number readonly />
                    <input type="hidden" :value="row.qty * row.price * row.tax / 100" v-model="row.tax_amount | currencyDisplay" number/>
                </td>
                <td>
                    <button class="btn btn-primary btn-xs" @click="addRow($index)">add row</button>
                    <button class="btn btn-danger btn-xs" @click="removeRow($index)">remove row</button>
                </td>
            </tr>
            </tbody>
            <tfoot>

            <tr>
                <td colspan="5" class="text-right">TAX</td>
                <td colspan="1" class="text-right">{{ taxtotal | currencyDisplay }}</td>
                <td></td>
            </tr>
            <tr>
                <td colspan="5" class="text-right">TOTAL</td>
                <td colspan="1" class="text-right">{{ total | currencyDisplay }}</td>
                <td></td>
            </tr>
            <tr>
                <td colspan="5" class="text-right">DELIVERY</td>
                <td colspan="1" class="text-right"><input class="form-control text-right" v-model="delivery | currencyDisplay" number/></td>
                <td></td>
            </tr>
            <tr>
                <td colspan="5" class="text-right"><strong>GRANDTOTAL</strong></td>
                <td colspan="1" class="text-right"><strong>{{ grandtotal = total + delivery | currencyDisplay }}</strong></td>
                <td></td>
            </tr>
            </tfoot>
        </table>
        <button @click="getData()">SUBMIT DATA</button>
        <pre>{{ $data | json }}

1 Ответ

0 голосов
/ 18 октября 2018

Nuxt use vue 2. В вашем codepen vue 1 связаны ссылки.

Вы не можете использовать v-модель со значением.Вам нужно удалить значение там, где у вас есть v-модель, и установить это значение в поле этой ссылки на v-модель.См. документы

v-модель будет игнорировать начальное значение, проверенные или выбранные атрибуты, найденные в любых элементах формы.Он всегда будет обрабатывать данные экземпляра Vue как источник правды.Вы должны объявить начальное значение на стороне JavaScript, внутри опции данных вашего компонента.

 <input type="hidden" :value="row.qty * row.price * row.tax / 100" v-model="row.tax_amount | currencyDisplay" number/>

Таким образом, это означает, что ваш row.row.tax_amount должен иметь значение set внутри javascript

row.qty * row.price * row.tax / 100

и код должен быть без: значение например

 <input type="hidden" v-model="row.tax_amount | currencyDisplay" number/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...