Element: [bug]在el-table中使用el-popover,没法点击确定或取消来关闭el-popover。

Created on 15 Dec 2016  ·  48Comments  ·  Source: ElemeFE/element

如题,在el-table中使用el-popover,没法点击确定或取消来关闭el-popover。

怀疑是作用域的问题,但是我把v-model改成row.visible2,@click的时候row.visible2 = false,这样也不行。所以感觉应该是个bug。
在talble外面使用el-popver是没问题的,而且点击popover区域外的地方也可以关闭popover,偏偏不能通过改变visible2 = false来关闭,不知道现在还有没有其他方式暴露出来可以控制hide。

参考代码:http://jsfiddle.net/acx0gnx3/ ,点击删除打开popover。

question

Most helpful comment

@istobran 或许这样比较完美吧
[email protected]

<el-table-column width="100" align="center" label="操作">
  <template slot-scope="scope">
    <el-popover width="160" :ref="`popover-${scope.$index}`">
      <p>确定删除该项吗?</p>
      <div style="text-align: right; margin: 0">
        <el-button type="text" size="mini" @click="scope._self.$refs[`popover-${scope.$index}`].doClose()">
          取消
        </el-button>
        <el-button type="danger" size="mini" >确定</el-button>
      </div>
      <el-button type="text" slot="reference">删除</el-button>
    </el-popover>
  </template>
</el-table-column>

All 48 comments

table 里用 popover 请使用 slot 的方式

@QingWei-Li 呃,我现在这样不是也是slot在el-table-column上的么。能不能举个例子,实在不太理解是哪种slot方式。抱歉抱歉。

我指的是 popover

<el-popover
  placement="right"
  title="标题"
  width="200"
  trigger="focus"
  content="这是一段内容,这是一段内容,这是一段内容,这是一段内容。">
  <el-button slot="reference">focus 激活</el-button>
</el-popover>

@QingWei-Li slot的方式确实可以替代ref解决点击“删除”按钮弹出popover问题。但现在用这种方式还是存在popover内的“确定”和“取消”这两个按钮点击后改成visible2这个值为false没法关闭popover的问题。就是popover没有消失。不知道是不是我哪里用不对。通过v-model来控制显示和消失,我是参考官网文档popover里面的样例做的。

但放在el-table里就不好用了。

可以参见:http://jsfiddle.net/acx0gnx3/1/

这是因为 visible2 在 column 里只是一个拷贝,并非实例上的 visible2,这个是已知问题。在 1.1 里我们计划把自定义模板的方式换成 Vue 的 scoped slot,就能解决这个问题。现在的话只能通过绑定方法的方式。

<el-table-column :context="_self" inline-template label="操作">
  <el-popover
    placement="right"
    title="确定删除?"
    width="200"
    v-model="visible2"
    trigger="click">
    <div style="text-align: right; margin: 0">
      <el-button size="mini" type="text" @click="updateVisible(true)">取消</el-button>
      <el-button type="primary" size="mini" @click="updateVisible(false)">确定</el-button>
    </div>
    <el-button slot="reference">删除</el-button>
  </el-popover>
</el-table-column>

然后定义一个 updateVisible 方法

@QingWei-Li 好的,果然还是作用域的问题。我看看怎么先凑合用吧。谢谢。

updateVisible () {
            this.visible2 = true;
            setTimeout(() => {
                this.visible2 = false;
            }, 0);
        }

用了这种比较tricky的方式可以实现了。

没必要吧,直接写成这样不就好了么

updateVisible(val) { this.visible2 = val }

这样不行。直接改成false好像没生效。表示很奇怪。。。必须得先设置成true,再变成false才会生效。。感觉是得让this重新变化再把值传到column才行?可能和vue更新机制有关系?有点费解。

哦 还是上下文的问题 popover 不能用 v-model ....

好吧略坑,等 1.1 我们加入 scoped slot 的方式吧

el-table-column里面嵌入 el-switch 后 switch开关无效! 看了上面您们讨论的 还是不行啊 switch 不起作用!

DreamFox 你可以用了吗? 你解决了吗?

@DreamFox

@hujianjian187 按照我上面说的那样修改v-model是可以的。。你试试吧。你最好给个jsfiddle之类的,好说清楚

@DreamFox 刚解决了 不是你那么写的

v-model="row.value1"
on-color="#13ce66"
off-color="#ff4949" @change="visibile">

            </el-table-column>

      visibile:function(){
                   this.value1 = !this.value1;
      }

你直接改this.value居然就可以,我得setTimeout才行。反正是上下文的问题。

@DreamFox 我用的change 不是 click

@QingWei-Li

艾特我干啥 😂

现在的利用 inline-template hack 的自定义模板功能坑有点多,1.1 后会支持 scoped slot 的方式并作为推荐用法。

@QingWei-Li 就是告诉您 这个解决了! 并感谢您思密达!

那我还是要把 inline-template 坑填了

请问,现在我用1.1.2,这个问题如何解决???

@wenner Scoped slot 具体看 Table 文档

@wenner 看文档!

我参考上面的代码....

            <el-table-column width="100" align="center" label="操作">
              <template scope="scope">
                <div class="show-on-row-hover buttons">
                  <el-button type="primary" size="mini" @click="editItem(scope.row)">
                    编辑
                  </el-button>
                  <el-popover
                    placement="top"
                    title="确定删除?"
                    width="200"
                    v-model="visible2"
                    trigger="click">
                    <p>确定要删除当前记录吗?</p>
                    <p class="text-danger">将同时删除该机构的所有下级机构!</p>
                    <div style="text-align: right; margin: 0">
                      <el-button size="mini" type="text" @click="updateVisible(false , scope)">取消</el-button>
                      <el-button type="primary" size="mini" @click="updateVisible(true )">确定</el-button>
                    </div>
                    <el-button slot="reference" size="mini">删除</el-button>
                  </el-popover>
                </div>
              </template>
            </el-table-column>

这样v-model = visible2 的话,是不显示的
如果 v-model = scope.visible2 , 是可以显示Popover的
如果 v-model = scope._self.visible2 , 还是不显示

因为对