2016-01-25 21 views
18

Tôi có một số thành phần tùy chỉnh trong Vue.js. Trong một trong các thành phần tôi có là một danh sách lựa chọn mà tôi muốn hiển thị như một hộp chọn Chosen. Tôi sử dụng chức năng này với hàm jQuery $("select").chosen().Vue.js có kích hoạt sự kiện sau khi thành phần được hiển thị không?

<template v-for="upload in uploads"> 
    <new-upload-container :index="$index" :upload="upload" v-if="isNewUpload"></new-upload-container> 
    <existing-upload-container :index="$index" :upload="upload" v-if="isExistingUpload"></existing-upload-container> 
</template> 

Sau khi tôi thêm dữ liệu vào mảng uploads bị ràng buộc trong trường hợp Vue, chế độ xem cập nhật với phiên bản thành phần. Thật không may khi tôi cố gắng để nhanh chóng Chosen trên trường chọn, nó không hoạt động.

Tôi không chắc liệu có phải mất một thời gian ngắn sau khi tôi thêm một mục vào mảng bị ràng buộc uploads mà DOM thực sự cập nhật hay không.

<template id="existing-upload-container"> 

     <select name="beats[@{{ index }}][existing_beat]" class="existing-beats"> 
      <option selected="selected" value="">-- Select a linked beat --</option> 
        @foreach ($beats as $beat) 
        <option value="{{$beat->id}}">{{$beat->name}}</option> 
        @endforeach 
     </select> 

    </template> 

Có sự kiện nào được kích hoạt sau khi một thành phần được hiển thị đầy đủ không?

Trả lời

8

Bạn có thể thử hai thứ trong thành phần của mình, dựa trên cái nào phù hợp với gói của bạn. Trong các đối tượng Vue:

{ 
    ready:function(){ 
     // code here executes once the component is rendered 
     // use this in the child component 
    }, 
    watch: { 
     uploads:function(){ 
      //code here executes whenever the uploads array changes 
      //and runs AFTER the dom is updated, could use this in 
      //the parent component 
     } 
    } 
} 
+8

sau +1, có vẻ như trong vuejs 2 'ready' được thay thế bằng' cập nhật', hãy xem tại đây: https://vuejs.org/v2/guide/instance.html tôi đã thử nghiệm 'sẵn sàng 'nó đã không làm việc –

+3

@MajedDH Tôi tin rằng một trong những chính xác sẽ được 'gắn' bởi vì cập nhật bao gồm nhiều hơn thế. Tôi không thể làm cho nó hoạt động với 'ready' nhưng' mounted' làm việc như mong đợi. – asselinpaul

+0

@asselinpaul, chúng khác nhau. với gắn kết bạn không thể giải quyết vấn đề ràng buộc một cái gì đó để tự động tạo ra các yếu tố từ dữ liệu được tải async. cập nhật các công trình ở đây. –

10

Cách đúng sẽ là một custom directive:

<select v-chosen name="beats[@{{ index }}][existing_beat]" class="existing-beats"> 

//insert/require() the following before the creation of your main Vue instance 
Vue.directive("chosen",{ 
    bind: function(){ 
    $(this.el).chosen(); 
    } 
}) 

chỉnh sửa: cú pháp chỉ thị thay đổi trong Vue 2. *:

Vue.directive("chosen",{ 
    bind: function(el){ 
    $(el).chosen(); 
    } 
}) 
+0

Điều này nghe giống như một giải pháp thanh lịch hơn [câu trả lời được chấp nhận] (http://stackoverflow.com/a/34997958/368864). – cambraca

+0

bị thiếu. trước khi được chọn()? – Kokizzu

+1

Cảm ơn, đã sửa. Cũng lưu ý rằng cú pháp này chỉ hoạt động với Vue 1. –

0

Một cách hay để thực hiện việc này là kết nối plugin Chosen trong V thành phần ue, như được mô tả chi tiết here.

Các vấn đề liên quan