问题
这不起作用有几个原因。
请注意,HTML 属性不区分大小写,在使用 in-DOM 模板时,您不能使用 v-on 来监听 camelCase 事件。
正如错误提示,您不能使用大写字母作为事件名称,因为 HTML 属性是 case-insensitive。
解决此问题的一种方法是使用kabab-case,即
this.$emit('address-saved');
<address-form
context="create"
@address-saved="..."
></address-form>
第二个问题是:
window.location.assign(route('customer.address.index'))
应该是:
window.location.assign('{{ route('customer.address.index') }}')
这是因为 route 函数将在服务器上进行评估,返回值是发送到浏览器的值,因此您需要告诉刀片回显该值,然后您还需要将其包装在引号。
很遗憾,这也无济于事,因为您无法访问 HTML 事件侦听器中的 window 对象。
解决方案
您可以尝试一些替代方案。
首先,您可以简单地将 url 作为 prop 传递给组件,然后让组件处理重定向。
HTML
<address-form
context="create"
redirect-on-save-url="{{ route('customer.address.index') }}"
></address-form>
将redirect-on-save-prop 添加到组件中:
props: ['redirect-on-save'],
//or
props: {
'redirect-on-save': {
type: String,
required: true,
}
},
最后,你可以使用 $emit 代替:
window.location.assign(this.redirectOnSaveUrl);
或者,您可以尝试将自己的 $redirect 方法添加到 Vue:
Vue.prototype.$redirect = function (url) {
window.location.assign(url);
};
那么你的 HTML 可能是:
<address-form
context="create"
@address-saved="$redirect('{{ route('customer.address.index') }}')"
></address-form>