2017-06-13 10 views
1

私のモーダルボックスは、vueコンポーネントの内部にあります。データが送信されると、コンポーネントに親に返信データを返信してルート要素に追加できるようにします。vue jsのコンポーネントからルートへの応答データの転記

コンポーネント

<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要素に応答データを追加したいです私のルー

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) 
    } 
} 

私のコンポーネントは今 これを持っています。$( 'データ受信'、応答)を放出

と子コンポーネントに

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

をV-上を置く私は、データが未定義または何も 取得enter image description here

私はポストに返されたデータを見ることができます...それは私のオブジェクトのidだ...私はそれを enter image description here

をエンコードする必要がありますJSON
+1

あなたはvue.jsになっているはずですが、私は(データをCONSOLE.LOGしようとしている – Prashank

+0

小道具)がハンドラにはありますが、定義されていないか何もありません。私は新しいコードで私の質問を編集しました – nivanmorgan

+0

あなたはフロントエンドではなくバックエンドに問題があるようです。同じリクエストで郵便配達員を使用しようとしましたか? –

答えて

1

最も簡単な方法は、応答を受け取ったときに子コンポーネント内のデータでイベントを発生させることです。子供で

: parrentでthis.$emit('data-received',response)

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

parrentでhandler機能では、あなたがデータをやりたいです。

UPDATED: バックエンドはJSONを返してREST API規格に準拠する必要があります。 単純な文字列であっても、APIの各エンドポイントはJSONを返す必要があります。

+0

私は、 Webコンソールで..オブジェクトを返します。jsonでエンコードする必要があります。 – nivanmorgan

+1

のレスポンスに別のイメージを投稿しました。バックエンドからJSONを返す必要があります。次に、コードがうまくいくはずです –

0

代わりのparrentで

:私はparrentで使用

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

<child-component v-on:data-received='handler'> 
関連する問題