Как заставить директиву Vue js работать в добавленном html-элементе

У меня есть директива Vue, добавленная в добавленный элемент html, такой как директива v-on, но она не работает на моем конце. В принципе, я хочу знать эквивалент .on() в jquery.

Ответ 1

"Компиляция Vue.js происходит, когда вы создаете экземпляр/монтируете корневой экземпляр. Он не обнаруживает ввод нового DOM, если он не является результатом директивы (например, v-repeat, v-partial будет динамически создавать новые фрагменты DOM )". https://github.com/vuejs/Discussion/issues/77

Вам нужно скомпилировать новый добавленный элемент следующим образом:

HTML:

<div id="app">
    <button v-on="click: addNewElement()">Add Element</button> 
    <br />
</div>

JavaScript

new Vue({
    el: '#app',
    data: {
        sampleElement: '<button v-on="click: test()">Test</button>'
    },
    methods:{
        addNewElement: function(){

           var element = $('#app').append(this.sampleElement);
           /* compile the new content so that vue can read it */
           this.$compile(element.get(0));
        },
        test: function(){
           alert('Test');
        }
    }
});

Смотрите этот рабочий Fiddle в Firefox: http://jsfiddle.net/chrislandeza/syewmx4e/

Обновление

$компиляция была удалена на Vue 2.x

Я видел людей, предлагающих Vue.compile или

var tmp = Vue.extend({ 
    template: 'Content'
})
new tmp().$mount(' id or refs ')

Но те 2 не ведут себя как старый $compile.

Ответ 2

Для Vue 2.x новое решение упоминается здесь в документе: https://vuejs.org/v2/api/#vm-mount (см. "Пример" ).

Пользовательский пример:

var MyComponent = Vue.extend({
  template: '<div v-on:click="world">Hello!</div>',
  methods : {
    world : function() {
      console.log('world')
    }
  }
})
 
var component = new MyComponent().$mount()
document.getElementById('app').appendChild(component.$el)
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.3.4/vue.min.js"></script>

<div id="app"></div>

Ответ 3

Вам нужно зарегистрировать html в качестве шаблона компонента.