Отправка данных ответа от компонента к корню в vue js

Мой модальный блок находится внутри компонента vue. Когда данные отправлены, я хочу, чтобы компонент отправлял данные ответа родительскому элементу, чтобы я мог добавить их к корневому элементу.

Компонент

<template>
    <div v-if="value.startsWith('new')">

    <!-- Create Client Modal -->
    <div class="modal show" id="modal-create-client" tabindex="-1" role="dialog">
        <div class="modal-dialog">
            <div class="modal-content">
                <div class="modal-header">
                    <button type="button " class="close" data-dismiss="modal" aria-hidden="true" @click.prevent="close">&times;</button>

                    <h4 class="modal-title">Details</h4>
                </div>
                <div class="modal-body">
                    <!-- Form Errors -->
                    <div class="alert alert-danger" v-if="createForm.errors.length > 0">
                        <p><strong>Whoops!</strong> Something went wrong!</p>
                        <br>
                        <ul>
                            <li v-for="error in createForm.errors">
                                {{ error }}
                            </li>
                        </ul>
                     </div>
                     <!-- Create Client Form -->
                     <form class="form-horizontal" role="form">
                         <!-- Name -->
                         <div class="form-group">
                             <label class="col-md-3 control-label">First Name</label>
                             <div class="col-md-7">
                                 <input id="create-client-name" type="text" class="form-control" @keyup.enter="store" v-model="createForm.first">
                             </div>
                         </div>

                         <div class="form-group">
                             <label class="col-md-3 control-label">Last Name</label>
                             <div class="col-md-7">
                                 <input type="text" class="form-control" name="last" @keyup.enter="store" v-model="createForm.last">
                             </div>
                         </div>
                         <div class="form-group">
                             <label class="col-md-3 control-label">Email</label>
                             <div class="col-md-7">
                                 <input type="text" class="form-control" name="organization" @keyup.enter="store" v-model="createForm.email">
                                 <span class="help-block">Email is required for invoices</span>
                             </div>
                         </div>
                         <div class="form-group">
                             <label class="col-md-3 control-label">Organization</label>
                             <div class="col-md-7">
                                 <input type="text" class="form-control" name="organization" @keyup.enter="store" v-model="createForm.organization">
                             </div>
                         </div>
                     </form>
                 </div>

                 <!-- Modal Actions -->
                 <div class="modal-footer" v-if="value == 'newClient'">
                     <button type="button" class="btn btn-default" data-dismiss="modal" @click.prevent="close">Close</button>
                     <button type="button" class="btn btn-primary" @click="storeClient">Create</button>
                  </div>
                  <div class="modal-footer" v-else-if="value == 'newLead'">
                      <button type="button" class="btn btn-default" data-dismiss="modal" @click.prevent="close">Close</button>
                      <button type="button" class="btn btn-primary" @click="storeLead">Create</button>
                  </div>
                  <div class="modal-footer" v-else-if="value == 'newContact'">
                      <button type="button" class="btn btn-default" data-dismiss="modal" @click.prevent="close">Close</button>
                      <button type="button" class="btn btn-primary" @click="storeContact">Create</button>
                  </div>
                </div>
            </div>
        </div>
    </div>
</template>

<script>      
   export default {
       data() {
           return {
               createForm: {
                   errors: [],
                   first: '',
                   last: '',
                   email: '',
                   organization: ''
               },
           };
       },
       props: ['value'],
       /**
       * Prepare the component (Vue 1.x).
       */
       ready() {
           this.prepareComponent();
       },
       /**
       * Prepare the component (Vue 2.x).
       */
       mounted() {
           var vm = this
           this.prepareComponent();
       },
       methods: {
           /**
           * Prepare the component.
           */
           prepareComponent() {

               $('#modal-create-client').on('shown.bs.modal', () => {
                   $('#create-client-name').focus();
               });
               $("#modal-create-client").on("hide.bs.modal", function(e) {
                   $(this).removeData('bs.modal');
               });
           },
           close() {
               $('#modal-create-client').removeClass('show');
           },

           /**
           * Create a new client for the user.
           **/
           storeClient() {
               this.persistClient(
                   'post', './clients/add',
                   this.createForm, '#modal-create-client'
               );
           },
           storeLead() {
               this.persistClient(
                   'post', './leads/add',
                   this.createForm, '#modal-create-client'
               );
           },
           storeContact() {
               this.persistClient(
                   'post', './contacts/add',
                   this.createForm, '#modal-create-client'
               );
           },
           /**
           * Persist the client to storage using the given form.
           */
           persistClient(method, uri, form, modal) {
               form.errors = [];

               this.$http[method](uri, form).then(response => {
                   location.reload();
                   $(modal).modal('hide');
               }).catch(response => {
                   if (typeof response.data === 'object') {
                       form.errors = _.flatten(_.toArray(response.data));
                   } else {
                       form.errors = ['Something went wrong. Please try again.'];
                   }
               });
            },
            watch: {
                value: function (value) {
                    // update value
                    $(this.$el).val(value)
                },
            }
        }
    }
</script>

Корневой элемент

var MyComponent = Vue.component('my-ajax-component', 
    require('./components/Toolbar.vue') );
    new Vue({
        el: '#select',
        data: {
            selected: ''
        },
        components: {
            // <my-component> will only be available in parent's template
            'my-ajax-component': MyComponent
        }
    });

и мой взгляд

<div class="form-group clearfix">
    <div class="col-xs-12" id="select">
        {!! Form::label('client_id', 'Choose Client:', ['class' => 'control-label']) !!}
        {!! Form::select('client_id', ['newClient' => 'New Client', $clients], null, ['title' => 'Select Client', 'class' => 'form-control selectpicker', 'v-model' => 'selected', 'data-live-search' => 'true']) !!}
        <br>
        <my-ajax-component v-bind:value="selected"></my-ajax-component>
    </div>
</div>

Вместо перезагрузки местоположения я хочу добавить данные ответа к элементу select, который является моим root

I changed my root element to 

new Vue({
el: '#select',
data: {
    selected: '',
    data: ''
},
components: {
    // <my-component> will only be available in parent's template
    'my-ajax-component': MyComponent
},
methods: {
    handler: function(data) {
        console.log('this is my data' + data)
    }
}

у моего компонента теперь есть это. $ emit ('data-Received', response)

и поставьте v-on в дочерний компонент

 <my-ajax-component v-bind:value="selected"  v-on:data-received='handler(data)'></my-ajax-component>

Я получаю неопределенные данные или ничего не получаю  введите описание изображения здесь

Я вижу данные, возвращенные в сообщении ... это идентификатор моего объекта ... должен ли я json кодировать его  введите описание изображения здесь


person nivanmorgan    schedule 13.06.2017    source источник
comment
вам следует изучить реквизиты vue.js   -  person Prashank    schedule 13.06.2017
comment
Я пытаюсь добавить console.log (данные) в обработчике, но получаю undefined или вообще ничего. Я отредактировал свой вопрос новым кодом   -  person nivanmorgan    schedule 15.06.2017
comment
Похоже, у вас проблема с серверной частью, а не с внешним интерфейсом. Вы пробовали использовать почтальона с таким же запросом?   -  person Marek Urbanowicz    schedule 15.06.2017
comment
Но я могу видеть данные, возвращенные с запросом на публикацию, в веб-консоли ... он отправляет обратно объект ... должен ли я json его кодировать ... Я разместил другое изображение в ответе   -  person nivanmorgan    schedule 15.06.2017


Ответы (2)


Самый простой способ - отправить событие с данными в дочернем компоненте, когда вы получите ответ.

В детстве: this.$emit('data-received',response)

В паренте: <child-component v-on:data-received='handler(data)'>

В handler функции parrent делайте с данными все, что хотите.

ОБНОВЛЕНО: ваш бэкэнд должен возвращать JSON, чтобы соответствовать стандартам REST Api. Каждая конечная точка API должна возвращать JSON, даже если это простая строка.

person Marek Urbanowicz    schedule 14.06.2017
comment
Я могу видеть данные, возвращенные с запросом на публикацию, в веб-консоли .. он отправляет обратно объект .. должен ли я json его кодировать .. Я разместил другое изображение в ответе - person nivanmorgan; 16.06.2017
comment
вы должны вернуть JSON из бэкэнда. Тогда ваш код должен работать - person Marek Urbanowicz; 16.06.2017

Вместо того

В родстве:

<child-component v-on:data-received='handler(data)'>

В паренте я использовал:

<child-component v-on:data-received='handler'>
person nivanmorgan    schedule 21.06.2017