2017-06-21 27 views
0

私のプロジェクトでは、このような構造を持っています。 サイドバーを持つクライアントページ、一般的なクライアントの情報、子ビューのルータービュー。Vue - axios - 同じリクエストを処理する

路線:

{ path: '/clients/:id', component: Client, 
    children: [ 
     { 
     path: '/', 
     component: ClientReview, 
     name: 'client-review' 
     }, 
     { 
     path: 'balances', 
     component: ClientBalances, 
     name: 'client-balances' 
     }, 
     { 
     path: 'report', 
     component: MainReport, 
     name: 'client-report' 
     }, 

クライアントのコンポーネント(Client.vue):

<template> 
    <el-row> 
    <client-menu></client-menu> 
    <el-col class="client-view" :md="{ span: 22, offset: 2}" :sm="{ span: 20, offset: 4}" :xs="{ span: 18, offset: 6}"> 
     <client-bar></client-bar> 
     <transition name="el-zoom-in-center"> 
     <router-view></router-view> 
     </transition> 
    </el-col> 
    </el-row> 
</template> 

<script> 
import ClientMenu from './ClientMenu.vue' 
import ClientBar from './ClientBar.vue' 

export default { 
    data() { 
    return { 
     loading: false, 
    }; 
    }, 
    components: { 
    'client-menu': ClientMenu, 
    'client-bar': ClientBar, 
    } 

} 
</script> 

ClientBarコンポーネント(ClientBar.vue):

<template> 
    <div class="client-bar"> 
    <el-col :span="18"> 
     <h3>{{ client.Name }}</h3> 
     <h4>{{ client.Address }}</h4> 
    </el-col> 
    <el-col :span="6" style="text-align: right;"> 
     <el-button-group> 
     <el-button icon="edit" size="small"></el-button> 
     <el-button icon="share" size="small"></el-button> 
     </el-button-group> 
    </el-col> 
    <div class="clrfx"></div> 
    </div> 
</template> 

<script> 

export default { 
    data() { 
    return { 
     client: {} 
    } 
    }, 
    mounted() { 
    this.loadClient() 
    }, 
    methods: { 
    loadClient: function() { 
     self = this; 
     this.axios.get('http://127.0.0.1:8020/clients/'+self.$route.params.id) 
     .then(function(response) { 
      self.client = response.data; 
      self.loading = false; 
     }) 
     .catch(function(error) { 
      console.log(error); 
     }); 
     } 
    } 
    } 
</script> 

そして私はClientReviewコンポーネントを持っていますこれはclients /:idルートのルートコンポーネントであり、同じapiを使用してクライアント情報をClientBarとしてロードします:

<template> 
    <div> 
    <el-row v-loading.body="loading"> 
     <el-col :span="12"> 
     <table class="el-table striped"> 
      <tr> 
      <td class="cell">Полное наименование</td> 
      <td class="cell">{{ clientInfo.FullName }}</td> 
      </tr> 
      <tr> 
      <td class="cell">УНП</td> 
      <td class="cell">{{ clientInfo.UNP }}</td> 
      </tr> 
      <tr> 
      <td class="cell">ОКЭД</td> 
      <td class="cell">{{ clientInfo.Branch.code }}<br>{{ clientInfo.Branch.name }}</td> 
      </tr> 
      <tr> 
      <td class="cell">Адрес</td> 
      <td class="cell">{{ clientInfo.Address }}</td> 
      </tr> 
      <tr> 
      <td class="cell">Аналитик</td> 
      <td class="cell">{{ clientInfo.Analytic.first_name }} {{ clientInfo.Analytic.last_name }}</td> 
      </tr> 
      <tr> 
      <td class="cell">Менеджер</td> 
      <td class="cell">{{ clientInfo.Manager.first_name }} {{ clientInfo.Manager.last_name }}</td> 
      </tr> 
     </table> 
     </el-col> 
     <el-col :span="12"> 
     <classification-report></classification-report> 
     </el-col> 
    </el-row> 
    </div> 
</template> 

<script> 
import ClassificationReport from '../reports/ClassificationReport.vue' 

export default { 
    data() { 
    return { 
     loading: false, 
     clientInfo: {} 
    } 
    }, 
    created() { 
    this.Client(); 
    }, 
    methods: { 
    Client: function() { 
     self = this; 
     self.loading = true; 
     self.axios.get('http://127.0.0.1:8020/clients/'+self.$route.params.id) 
     .then(function(response) { 
      self.clientInfo = response.data; 
      self.loading = false; 
     }) 
     .catch(function(error) { 
      console.log(error); 
     }); 
    } 
    }, 
    components: { 
    'classification-report': ClassificationReport 
    } 
} 
</script> 

問題は、最初にページclient /:idを読み込んだり、ClientReviewでページクライアントのデータを更新しても読み込まれないという問題です。 コンポーネントがレンダリングされ(Vue Devtoolsで表示されているように)、サーバーへの両方のリクエストが送信されますが、ClientReviewのclientInfoオブジェクトはまだ空です。 残高またはレポートページに移動した後にクライアントレビューページに移動すると、すべてがロードされます。 誰かが私を助けてくれることを願っています。

答えて

0

selfは、windowオブジェクトへの別の参照であり、すべてのモジュールで使用できるためです。

手順を実行して、このバグが起こっている理由を見てみましょう。

  1. client:/idを読み込みます。
  2. ClientReviewcreatedメソッドは、ajaxリクエストを行い、selfthisに割り当てます。
  3. ClientBarmounted方法は、AJAXリクエストを行い、そして再thisselfを割り当てます。これにより、ClientReviewの変数参照selfも変更されています。
  4. ClientReview ajaxは終了し、self.clientInfo = response.data;を割り当てます。 selfClientBarへの参照であり、ClientBarclientInfoをルートデータプロパティとして宣言していないため、この割り当ては何も行いません。
  5. ClientBar ajaxが終了し、self.client = response.data;が割り当てられます。
  6. あなたはClientReviewから離れて行きます。
  7. ClientReviewに戻る。手順2を繰り返します。ClientBarはすでにレンダリングされており、selfを再割り当てしないため、
  8. ClientReviewが正常にレンダリングされます。

答えは、self = thisの代わりにlet self = thisとなります。

レッスンは常にvarletまたはconst YOUR変数を宣言です。

関連する問題