Причина, по которой ваш текущий подход не работает, заключается в том, что переменная myDisco в disco () ограничена этой функцией, поэтому, когда вы вызываете ее снова, чтобы попытаться очистить интервал, вместо новой один, содержащий идентификатор интервала.
Один простой способ исправить это - просто поместить идентификатор интервала в data () вместо отдельного логического значения stopIt:
new Vue({
el: '.container',
data() {
return {
myDisco: undefined,
color: 'lightgreen',
}
},
directives: {
'myEvent': {
bind(el, binding) {
el.addEventListener(binding.arg, binding.value)
}
}
},
methods: {
disco() {
this.stopDisco(); // just in case there's any chance of calling disco() twice in a row...
this.myDisco = setInterval(() => {
this.color == 'lightgreen' ? this.color = 'lightcoral' : this.color = 'lightgreen';
}, 100)
},
stopDisco() {
clearInterval(this.myDisco); // will be a harmless no-op if myDisco is false
this.myDisco = undefined; // not strictly necessary, but just to be tidy
}
}
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
<div class="container">
<div :style="{color: color}">
<h1>Directives Exercise</h1>
</div>
<button v-my-event:mouseover="disco" v-my-event:mouseleave="stopDisco" class="btn btn-primary">Disco Time!</button>
<div>Interval ID: {{myDisco}}</div>
</div>
Ваш пример работает на моем компьютере должным образом. Проверьте, действительно ли файлы MicrosoftAjax.js и MicrosoftMvcAjax.js находятся в папке ../../Scripts.
Мне пришлось изменить AjaxOptions в моем вызове ActionLink, чтобы он заработал:
<%= Ajax.ActionLink("Update", "UpdateContent", new AjaxOptions() { HttpMethod = "Post", UpdateTargetId = "target", InsertionMode = InsertionMode.Replace })%>