关闭在另一个事件函数中创建的模态
Close modal which has been created in another event function
在我的第一个活动中,我将打开一个 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 和 select 搜索一个项目。在 selection 之后,模态应该被 `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;
}
}
});
使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');
}
});
确保第二个包依赖于第一个包:
api.use('first-package')
只能从依赖项导出。
不要这样做 - it violates software engineering principles.
您努力寻找解决方案的原因是一个强烈的暗示,表明这不是构建应用程序的好方法。
您希望 packageMBox 嵌入 packageTypeAhead,这意味着 packageMBox 依赖于 packageTypeAhead。
并且您希望 packageTypeAhead 进入 packageMBox 并控制它,要求(感谢 Gaelan)packageTypeAhead 依赖于 packageMBox。
这就是双向耦合,即使你找到了让它起作用的方法,你又得到了什么?您有两个包,它们都不能独立使用(甚至不能正确测试)。
所以解决方法是:将两个包合并为一个包。
'Package for everything' 是构建应用程序的好方法,但重要的是要考虑拆分功能的方式和位置,以免产生比开始时更多的问题。
如果您要使用全局变量,您也可以使用 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 函数来保存您的模态实例。我对 meteor 不熟悉,所以我不确定你将如何做到这一点,但从你已经写的内容来看,它应该是可能的。
如果您想完成它,请添加评论。
在我的第一个活动中,我将打开一个 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 和 select 搜索一个项目。在 selection 之后,模态应该被 `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;
}
}
});
使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');
}
});
确保第二个包依赖于第一个包:
api.use('first-package')
只能从依赖项导出。
不要这样做 - it violates software engineering principles.
您努力寻找解决方案的原因是一个强烈的暗示,表明这不是构建应用程序的好方法。
您希望 packageMBox 嵌入 packageTypeAhead,这意味着 packageMBox 依赖于 packageTypeAhead。
并且您希望 packageTypeAhead 进入 packageMBox 并控制它,要求(感谢 Gaelan)packageTypeAhead 依赖于 packageMBox。
这就是双向耦合,即使你找到了让它起作用的方法,你又得到了什么?您有两个包,它们都不能独立使用(甚至不能正确测试)。
所以解决方法是:将两个包合并为一个包。
'Package for everything' 是构建应用程序的好方法,但重要的是要考虑拆分功能的方式和位置,以免产生比开始时更多的问题。
如果您要使用全局变量,您也可以使用 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 函数来保存您的模态实例。我对 meteor 不熟悉,所以我不确定你将如何做到这一点,但从你已经写的内容来看,它应该是可能的。
如果您想完成它,请添加评论。