如何将弹出框中的输入标签绑定到Vue Model?

5

我有一个像这样的弹出框内容中的 input

JSFiddle

HTML:

<div id="vue-app">
    <div class="btn btn-primary" data-toggle="popover" data-placement="bottom" title="Hello World!" data-html="true" data-content='<input v-model="message"/>'>
        Click Me!
    </div>
    <hr>
    <input v-model="message"> {{ message }}
</div>

以下是JS的代码:

new Vue({
    el: '#vue-app',
    data: {
        message: 'I am a Text'
    }
});
$(document).ready(function() {
    $('[data-toggle="popover"]').popover();
});

从代码中可以看出,data-content之外的输入已经成功绑定,但是内部的输入没有成功绑定!

如果您有任何想法,请不吝赐教。

4个回答

5
你可以像这样使用:
以下是可工作的演示:https://output.jsbin.com/mokoka https://jsbin.com/mokoka/edit?html,js,output
<!DOCTYPE html>
<html>
<head>
  <script type="text/javascript" src="https://code.jquery.com/jquery-1.12.4.min.js"></script>
  <link rel="stylesheet" type="text/css" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/css/bootstrap.min.css">
  <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/js/bootstrap.min.js"></script>
  <script type="text/javascript" src="https://unpkg.com/vue@2.4.2"></script>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width">
</head>
<body>

<div id="vue-app">
  <div class="btn btn-primary" data-toggle="popover" data-placement="bottom" title="Hello World!" data-html="true">
    Click Me!
  </div>
  <hr>
  <input type="text" v-model="message"> {{ message }}

  <div id="popper-content" class="hide popper-content">
    <input type="text" v-model="message">
  </div>
</div>

</body>
</html>

JavaScript:

new Vue({
  el:'#vue-app',
  data: {
    message: 'I am a Text!'
  }
})

$(document).ready(function(){
  $('[data-toggle="popover"]').popover({
    html: true,
    content: $('#popper-content')
  }).on('show.bs.popover', function() {
    $('#popper-content').addClass('show')
  }).on('hide.bs.popover', function() {
    $('#popper-content').addClass('hide')
  })
});

不错!只有一个小建议,您可以从弹出框html中删除data-html="true",因为在JS中您已经指定了html:true - Tushar
你可以从代码中删除js中的“html:true”。 - Chandra Kumar
这不是最优雅的解决方案,因为您在此处混合了两个库(Vue 和 Jquery)。Vue 本身可以使用更少的代码(使用 v-if)自行处理此问题。 - JayL

3

Vue 无法直接识别您动态创建的 HTML 元素,因此无法绑定您创建的输入元素。如果您真的想通过这种方式解决问题,我认为渲染函数可以帮助您:https://v2.vuejs.org/v2/guide/render-function.html

然而,更加优雅的解决方案(在我看来)是创建基本的 Vue v-if 函数。

HTML:

<div id="vue-app">
    <div class="btn btn-primary" v-on:click="showPop = !showPop">Click Me!</div>
    <div class="mypopover" v-if="showPop">
        <p>Title</p>
        <input v-model="message">
     </div>
    <hr>
    <input v-model="message">
    {{ message }}
</div>

Js:

new Vue({   
    el:'#vue-app',
    data: {
        message: 'I am a Text',
        showPop: false
    }
 });

只需应用Bootstrap的CSS类进行样式设计。


0
我发现了一个有用的Vue包(vue-popper)。
它可以在不使用Bootstrap的情况下完成相同的事情! JSFiddle
<popper trigger="click" :options="{placement: 'bottom'}">
  <div class="popper">
    <input type="text" v-model="message">
  </div>

  <div slot="reference" class="btn">
    Click Me!
  </div>  
</popper>

干杯!


这个更好 https://www.npmjs.com/package/@soldeplata/popper-vue - Soldeplata Saketos

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接