<div class="row" v-for="(book, index) in Subsequent" :key="index">
    <div class="col-md-8">
        <div class="form-group label-floating">
            <label class="control-label"> Details</label>
            <input type="text" class="form-control" v-model="book.seizuredetails" id="transliterateTextarea2">
        </div>
    </div>
</div>
<a @click="addNewRow">Add Another</a>
</div>

我在第一个输入框中输入音译.(第一种情况下没有问题)

所以,当我点击"添加另一个"时,我可以有一个新的输入框.但在这种情况下,音译是不起作用的.

我的音译是

  <script type="text/javascript">

      // Load the Google Transliterate API
      google.load("elements", "1", {
          packages: "transliteration"
      });

      function onLoad() {
          var options = {
              sourceLanguage: google.elements.transliteration.LanguageCode.ENGLISH,
              destinationLanguage: [google.elements.transliteration.LanguageCode.MALAYALAM],
              shortcutKey: 'ctrl+g',
              transliterationEnabled: true
          };

          // Create an instance on TransliterationControl with the required
          // options.
          var control = new google.elements.transliteration.TransliterationControl(options);

          // Enable transliteration in the textbox with id
          // 'transliterateTextarea'.
          var ids = [ "transliterateTextarea", "transliterateTextarea1", "transliterateTextarea2" ];
          control.makeTransliteratable(ids);
      }
      google.setOnLoadCallback(onLoad);
  </script>

所以,当点击Addanother时,我怎样才能给输入区域一个新的音译id呢.

请帮我找到解决办法.

推荐答案

基本上,你会得到makeTransliteratable个代码并将其放入一个方法中.在那之后,你可以对任何你想使其可翻译的输入调用这样的方法.

不过也有一些trap .

第一个问题是如何判断谷歌音译是否已加载.我在方法中使用了Promise(window.googleIsloaded)和await window.googleIsLoaded;来保证只加载了after个google.

第二个问题要糟糕得多:当进行音译时,谷歌直接设置<input>的值,这样做时不会发出任何事件.由于没有事件,Vue无法更新v-model属性.为了克服这一点,我创建了一个Proxy,它可以拦截对输入的任何调用,并在谷歌直接设置值时发出一个输入事件,从而允许Vue获取更改.缺点是Proxy APInot available in IE.

JSFiddle demo here.


Update:

好吧,我想出了一个work in all IE versions Vue support的解决方案,也能把它变成Vue 100.

所以你所要做的就是在<input><textarea>中加上v-transliterate="options",即options,你的对象或属性包含特定<input>/<textarea>的音译配置.例子:

<input type="text" v-model="somevar" v-transliterate="options">

Demo JSFiddle here.代码:

<script src="https://unpkg.com/vue"></script>
<script type="text/javascript" src="https://www.google.com/jsapi"></script>
<script>
  // Load the Google Transliterate API
  google.load("elements", "1", {
    packages: "transliteration"
  });

  Vue.directive('transliterate', function (el, binding) {
      var control = new google.elements.transliteration.TransliterationControl(binding.value);
      // a getter for each property google transliterate reads and a setter for each it modifies
      var inputOrTextareaProxy = {
          get getAttribute() { return el.getAttribute.bind(el); },
          get addEventListener() { return el.addEventListener.bind(el); },
          get blur() { return el.blur.bind(el); },
          get focus() { return el.focus.bind(el); },
          get tagName() { return el.tagName; },
          get type() { return el.type; },
          get id() { return el.id; },
          get style() { return el.style; },
          get selectionStart() { return el.selectionStart; },
          get selectionEnd() { return el.selectionEnd; },
          get value() { return el.value; },
          set value(v) { el.value = v; el.dispatchEvent(new CustomEvent('input')); },
          get nodeType() { return el.nodeType; },
          get ownerDocument() { return el.ownerDocument; },
          get scrollTop() { return el.scrollTop; },
          set scrollTop(v) { el.scrollTop = v; }
      };
      control.makeTransliteratable([inputOrTextareaProxy]);
  });
</script>

<div id="app">
  <div class="row" v-for="(book, index) in Subsequent" :key="index">
    <div class="col-md-8">
      <div class="form-group label-floating">
        <label class="control-label"> Details</label>
        <input type="text" class="form-control" v-model="book.seizuredetails" v-transliterate="options"> (Type "World." with the dot!) {{ book.seizuredetails }}
      </div>
    </div>
  </div>
  <a @click="addNewRow">Add Another</a>
</div>
new Vue({
  el: '#app',
  data: {
    message: 'Hello Vue.js!',
    Subsequent: [
        {seizuredetails: ''}
    ],
    options: {
      sourceLanguage: google.elements.transliteration.LanguageCode.ENGLISH,
      destinationLanguage: [google.elements.transliteration.LanguageCode.MALAYALAM],
      shortcutKey: 'ctrl+g',
      transliterationEnabled: true
    }
  },
  methods: {
    addNewRow: function() {
        this.Subsequent.push({seizuredetails: ''})
    }
  }
})

Vue.js相关问答推荐

使用 cypress 进行 e2e 测试的 vuejs 期间出现 Webpack 错误

如何使用 vue 或 javascript 向服务器发送密码?

如何使用 vue.js 获取本地 html 文件?

VuetifyJS:如何摆脱 v-stepper 组件的提升?

如何在map中添加新的标记 onclick?

Vuejs中的条件a href

确保在渲染组件之前加载 Vuex 状态

apache上的Vue-router,子目录下的SPA,只能通过重定向访问页面

W3C 验证和 Vue 的 HTML 绑定语法

vuejs中通过变量动态调用方法

Laravel 中的 VueJS 组件实现中的鼠标悬停

Nuxt 应用程序在刷新动态路由时返回 404(Tomcat 服务器)

我在 Nuxt 2.14.0 中运行的是什么版本的 Vue?

Vuejs 3 从子组件向父组件发出事件

Vue 3:模块 '"../../node_modules/vue/dist/vue"' 提示

在 nuxt.js 页面中包含外部 javascript 文件

从 ajax 调用填充 Vue.js 中的下拉列表

mount() 仅在组件 Vue.js 上运行一次

如何将props传递给组件的故事?

在 Vuejs 中全局导入 Axios 方法