【问题标题】:Close modal which has been created in another event function关闭在另一个事件函数中创建的模态
【发布时间】:2015-09-30 22:17:06
【问题描述】:

在我的第一个活动中,我将打开一个 mbox 对话框。 mbox 是 bootbox 的一种扩展,用于显示模态框。我需要 mbox 使用另一个模板作为模态内容。

所以在modal中会加载createElement-Template的内容。如果用户进行了一些输入更改,则应关闭模式。因此有函数modal("hide")。 但是由于bbox 是在第一个模板事件中设置的,并且模态的关闭将在第二个模板事件中完成,所以我在关闭模态时遇到了问题。

活动

Template.main.events({
    'submit form': function(event, template) {
        event.preventDefault();

        var bbox = mbox.dialog({
            title: 'title',
            message: Template.createElement
        });
    }
});

Template.createElement.events({
    'change input': function(event, template) {
        bbox.modal('hide');
    }
});

更新

上述问题适用于全局变量。感谢亚当。

但我不想破坏一个由另一个创建的流星包中的模态。我尝试使用全局变量并尝试使用api.export()。但它仍然不起作用。我也尝试过使用 Sessions。

package-graph/lib/client/graph.js

var bbox;
CanvasManager = {
    onShowAddToolTip (element) {
        bbox = mbox.dialog({ // <-- Create Modal
            title: "Title",
            message: Template.search, // <-- Loading Template search with just one input field with typeahead
        });
    },
}

CanvasManger.create(...);

package-graph/lib/package.js

api.export('bbox');

第二个包提供了一个预先输入的搜索框 (sergeyt:typeahead)。通过在第一个包中创建模态,模板将被加载到模态(helloludger:mbox)中。现在用户可以通过 typeahead 搜索并选择一个项目。选择后模态应该被 `modal('hide') 销毁。

package-search/lib/client/events.js

Template.searchMain.onRendered(function() {
    Meteor.typeahead.inject();
});

package-search/lib/client/helper.js

Template.search.helpers({ // <-- getting the data for the input typeahead
    searchData: function() {
        return [
            {
                name: 'cat1',
                valueKey: 'title',
                displayKey: 'title',
                header: '<h3 class="category-name">Category</h3>',
                template: 'searchResults',
                local: function() {
                    return Collection.find().fetch();
                }
            }
        ]
    },
    selected: function(event, suggestion) { // <-- by selecting an item, I can process the data and remove the modal
            // do something
            bbox.modal('hide'); // <!-- destroy modal
            return;
        }
    }
});

【问题讨论】:

  • 您也可以发布 HTML 吗?在 Meteor 中,您可以通过 Template.instance() 共享和访问模板实例上的状态对象。
  • 如果您删除 bbox 前面的 var,您应该能够跨文件访问它。尝试更改 var bbox;到 bbox = null;

标签: javascript meteor bootbox


【解决方案1】:

bbox 设为全局变量:

var bbox;
Template.main.events({
    'submit form': function(event, template) {
        event.preventDefault();

        bbox = mbox.dialog({
            title: 'title',
            message: Template.createElement
        });
    }
});

Template.createElement.events({
    'change input': function(event, template) {
        bbox && bbox.modal('hide');
    }
});

【讨论】:

  • @user3142695 - 您无法保证此时已设置bbox(它可能仍为undefined)。 bbox &amp;&amp; doSomething()if(bbox) { doSomething() } 一样,只是 JavaScript 的简写
  • 我尝试使用全局变量,它适用于第一个示例。但是在使用包的情况下,我遇到了同样的问题。我更新了帖子以使其更清楚。请看一下。
【解决方案2】:

不要这样做 - it violates software engineering principles.

您一直在努力寻找解决方案的原因是强烈暗示这不是构建应用程序的好方法。

  • 您希望 packageMBox 嵌入 packageTypeAhead,这意味着 packageMBox 依赖于 packageTypeAhead。

  • 并且您希望 packageTypeAhead 进入 packageMBox 并对其进行控制,要求(感谢 Gaelan)packageTypeAhead 依赖于 packageMBox。

这是双向耦合,即使你找到了让它工作的方法,你实现了什么?你有两个包,它们都不能独立使用(甚至不能正确测试)。

所以解决方案是:将两个包合并为一个包

'Package for everything' 是构建应用程序的好方法,但重要的是要考虑拆分功能的方式和位置,以免造成比开始时更多的问题。

【讨论】:

    【解决方案3】:

    确保第二个包依赖于第一个:

    api.use('first-package')
    

    只有依赖项的导出可用。

    RelevantMeteordocs

    【讨论】:

      【解决方案4】:

      如果您要修改全局变量,也可以修改 mbox

      mbox.myModal = mbox.dialog({
        title: 'title',
        message: Template.createElement
      });
      

      然后在 package-search/lib/client/helper.js

      Template.search.helpers({
          ...
          selected: function(event, suggestion) {
                  mbox.myModal && mbox.myModal.modal('hide');
                  mbox.myModal = null;
                  return;
              }
          }
      });
      

      不过,理想情况下,您应该创建自己的第三个独立模块来在两个包之间进行通信,并将其注入到两个包中。这样它们就不会耦合并且可以共享状态。

      在这个共享模块中,你只需要一个 setter 和 getter 函数来保存你的模态实例。我对流星不熟悉,所以我不确定你将如何做到这一点,但从你已经写的来看,应该可以。

      如果您想解决它,请添加评论。

      【讨论】:

      • 我想这样做。你能给我一些代码示例吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-03-30
      • 2018-09-22
      • 2013-10-12
      • 2018-03-17
      • 2021-10-16
      相关资源
      最近更新 更多