html.erb 模板中的 v-model 渲染 function () [native code]

Posted

技术标签:

【中文标题】html.erb 模板中的 v-model 渲染 function () [native code]【英文标题】:v-model in html.erb template renders function () [native code] html.erb 模板中的 v-model 渲染 function () [native code] 【发布时间】:2021-04-05 16:58:26 【问题描述】:

我正在将 Vue.js 添加到我的 Rails 6 应用程序中。该项目正在使用 turbolinks,因此“vue-turbolinks”是通过 yarn 安装的,我的 Vue 配置如下所示:

import TurbolinksAdapter from 'vue-turbolinks';
import Vue from 'vue/dist/vue.esm';
Vue.use(TurbolinksAdapter);

document.addEventListener('turbolinks:load', () => 
  const app = new Vue(
    el: '[data-behavior="vue"]',

    data() 
      return 
        message: 'This string will update with input from text field',
      ;
    ,

    methods: 
      updateMessage(event) 
        this.message = event.target.value;
      ,
    
  );
);

我的 rails 模板(.html.erb)包含一个带有 Vuejs“v-model”属性的文本字段

  <div data-behavior="vue">
     message 
      <%= f.text_field :title, "v-model": "updateMessage" %>
  </div>

Vue 似乎按预期工作,除了“v-model”输出文字函数而不是调用函数(updateMessage)。结果,文本字段呈现的值为

"function ()  [native code] "

但是,将“v-model”更改为“v-on:input”可以满足我的预期:更新输入消息。

任何人都可以阐明这里发生的事情或指出正确的方向来解决此问题。提前感谢您的时间。

【问题讨论】:

【参考方案1】:

您使用v-model 创建模板绑定:

您可以使用 v-model 指令创建双向数据绑定

您使用v-on 附加一个事件侦听器:

将事件侦听器附加到元素。事件类型由参数表示。表达式可以是方法名称、内联语句,如果存在修饰符,则可以省略。

所以这是预期的行为,因为您显然是在尝试将事件侦听器附加到输入事件。

当您使用v-model(错误地)时,它评估表达式以将其放入输入的value,就好像它是一个原始绑定一样。因为你的表达式是一个函数,所以你得到了你所做的结果。

您的困惑可能源于v-model 是一种既是绑定又是侦听器的特殊语法,但它们是预定义的。这意味着当您使用它时,您无需指定您自己的监听器,而是您希望它在收到来自子级的input 事件时更改的模型。

【讨论】:

以上是关于html.erb 模板中的 v-model 渲染 function () [native code]的主要内容,如果未能解决你的问题,请参考以下文章

渲染 js.erb 布局但 html.erb 视图文件

来自 application.html.erb 的 Rails 渲染实例变量

Rails 不使用 application.html.erb

将 Rails 渲染格式限制为 html 的方法

Vue3 中的模板语法

Rails 6.0.4 远程:true 不在浏览器中 js/ajax 渲染 _partial.html.erb