2016-05-14 22 views
7

tôi có mã này:phương pháp truy cập mẹ từ mẫu thành phần trong vuejs

 new Vue({ 
     el: '#app', 
     components: { 
      'app-component': AppComponent 
     }, 
     data: { 
      message: 'Hello Vue.js!' 
     }, 
     methods: { 
      doSomething: function(){ 
       console.log('arrived!') 
      } 
     } 
    }) 

Làm thế nào tôi có thể gọi là "doSomething" phương pháp từ AppComponent html mẫu? như thế này:

<app-component> 
    <a href="#" v-on:click="doSomething()">text</a> 
</app-component> 

tôi nhận được lỗi này:

Uncaught TypeError: scope.doSomething is not a function

+0

thử 'v-on: click = "doSomething" ' – maioman

+0

@maioman Tôi nhận điều này: [Vue cảnh báo]: v-on: click = "doSomething" hy vọng một giá trị chức năng, đã không xác định (có trong thành phần : ) – saeedhbi

Trả lời

1

Bạn có thể sử dụng $ công văn từ đứa trẻ để kích hoạt một sự kiện. Ví dụ:

// App component 
<app-component> 
    <a href="#" v-on:click.prevent="$dispatch('do-something')">text</a> 
</app-component> 


// Parent 
new Vue({ 
    el: '#app', 
    components: { 
     'app-component': AppComponent 
    }, 
    data: { 
     message: 'Hello Vue.js!' 
    }, 
    events: { 
     'do-something': function(){ 
      console.log('arrived!') 
     } 
    } 
}); 

Để biết thêm về thông tin liên lạc giữa phụ huynh và trẻ em, kiểm tra tài liệu: http://vuejs.org/guide/components.html#Parent-Child-Communication

+0

Có giải pháp nào không có sự kiện không? Ví dụ như tạo mẫu Vue hoặc v.v. – saeedhbi

+1

@saeedhbi Tôi cố gắng đạt được một cái gì đó tương tự như bạn, đặt tất cả các phương thức chia sẻ/phổ biến trong thành phần cơ sở và sau đó mở rộng thành phần cơ sở để tạo thành phần mới yêu cầu các phương thức chung/phổ biến. Sử dụng mixin hoặc plugin tùy chỉnh có vẻ là một giải pháp thanh lịch hơn. Tôi hiện đang sử dụng cách tiếp cận mixin, trong đó tôi có tất cả các phương thức chia sẻ trong một mixin và bất cứ khi nào bất kỳ thành phần nào yêu cầu các phương thức chia sẻ đó, tôi sử dụng mixin trong thành phần đó. Mixins trong Vue giống như 'trait trong php'. Hy vọng nó giúp. – Donkarnash

+0

Tắt nguyên nhân, mixin là câu trả lời! Cảm ơn bạn! – pilat

0

Ngoài phản ứng Wiljan, tôi mở rộng tất cả các thành phần với dụ Vue mới có phương pháp và dữ liệu. Bây giờ tôi tiếp cận với các phương pháp và vv

+0

Bạn có thể mở rộng trên đó không? Tôi không chắc chắn, nhưng có vẻ như một điều chắc chắn không làm ... –

+0

@LinusBorg Tôi không muốn chia sẻ các phương pháp với đạo cụ hoặc sự kiện và các phương pháp và dữ liệu này toàn cầu như người dùng hoặc công ty và phải được chia sẻ tất cả hơn ứng dụng ngay cả các thành phần. Và tôi không muốn sử dụng chúng với $ cha mẹ hoặc $ công văn hoặc vv Trên mỗi thành phần tôi sử dụng "mở rộng" bất động sản để có được nó và sử dụng trên này. Bây giờ tôi truy cập vào tên phương thức thành mẫu thành phần. Tôi biết các thành phần là isole và nó là tốt hơn để được cô lập, Nhưng tôi nghĩ rằng điều này không đánh bại bất cứ điều gì. – saeedhbi

10

thử v-on:click="$parent.doSomething()"

0

Bạn có thể sử dụng, dựa trên this answer.

this.$parent.$options.methods.someParentMethod(data) 
Các vấn đề liên quan