有没有一种干净的方式来获取当前模板的父模板? Meteor的API没有正式记录。 我在说的是Blaze.TemplateInstance
,而不是上下文(即不是Template.parentData
)。如何获取(当前模板的)父模板实例
回答
最后,我使用流星的parentData
类似地扩展了模板实例,如下所示:
/**
* Get the parent template instance
* @param {Number} [levels] How many levels to go up. Default is 1
* @returns {Blaze.TemplateInstance}
*/
Blaze.TemplateInstance.prototype.parentTemplate = function (levels) {
var view = this.view;
if (typeof levels === "undefined") {
levels = 1;
}
while (view) {
if (view.name.substring(0, 9) === "Template." && !(levels--)) {
return view.templateInstance();
}
view = view.parentView;
}
};
用法示例:someTemplate.parentTemplate()
获得直接父
有没有一种干净的方式来获取当前 模板的父模板?
目前,没有,我知道的,但这应该在未来的计划“设计的可重用组件更好的API”的一部分,有时发生(这是在Meteor post 1.0 roadmap讨论)。
就目前而言,这里是我用在我的项目解决方法:
// extend Blaze.View prototype to mimick jQuery's closest for views
_.extend(Blaze.View.prototype,{
closest:function(viewName){
var view=this;
while(view){
if(view.name=="Template."+viewName){
return view;
}
view=view.parentView;
}
return null;
}
});
// extend Blaze.TemplateInstance to expose added Blaze.View functionalities
_.extend(Blaze.TemplateInstance.prototype,{
closestInstance:function(viewName){
var view=this.view.closest(viewName);
return view?view.templateInstance():null;
}
});
注意,这是仅支持命名父模板,应该以同样的方式工作,因为jQuery的closest
遍历父查看从一个孩子到最顶层模板(正文)的节点,搜索适当命名的模板。
一旦这个扩展大火已在客户端代码的地方注册,你可以做这样的东西:
HTML
<template name="parent">
<div style="background-color:{{backgroundColor}};">
{{> child}}
</div>
</template>
<template name="child">
<button type="button">Click me to change parent color !</button>
</template>
JS
Template.parent.created=function(){
this.backgroundColor=new ReactiveVar("green");
};
Template.parent.helpers({
backgroundColor:function(){
return Template.instance().backgroundColor.get();
}
});
Template.child.events({
"click button":function(event,template){
var parent=template.closestInstance("parent");
var backgroundColor=parent.backgroundColor.get();
switch(backgroundColor){
case "green":
parent.backgroundColor.set("red");
break;
case "red":
parent.backgroundColor.set("green");
break;
}
}
});
感谢您的精心解答@saimeunt!不完全是我想要的,但很有用。我已经建立了就像流星的'parentData'的功能,但我upvoting你的答案,因为'closest'也是一个有用的模式 –
我到目前为止一直在做的是,如果我需要访问一个子模板的功能父实例,我尝试,而不是重构这个函数声明它在父级模板上,然后将它作为参数传递给子,然后可以执行它。
作为一个例子,假设我想在子模板中的父模板上增加一个模板变量。我可以写这样的事:
Template.parentTemplate.onCreated(function() {
var parentInstance = this;
parentInstance.count = new ReactiveVar(1);
});
Template.parentTemplate.helpers({
incrementHandler: function() {
var parentInstance = Template.instance();
var count = parentInstance.count.get();
return function() {
var newCount = count + 1;
parentInstance.count.set(newCount);
};
}
});
然后包括我的孩子的模板:
{{> childTemplate handler=loadMoreHandler}}
并成立了我的事件:
Template.childTemplate.events({
'click .increment-button': function (event, childInstance) {
event.preventDefault();
childInstance.data.handler();
}
});
如果你不希望延长Blaze.TemplateInstance
你可以像这样访问父实例:
Template.exampleTemplate.onRendered(function() {
const instance = this;
const parentInstance = instance.view.parentView.templateInstance();
});
只在流星1.4.x测试过
经过了1.5测试,并且正常工作:) – Daniel
- 1. 如何获取Jinja2模板中当前模板的文件名?
- 2. 如何获取模板实例ID?
- 3. 获取当前创建的实例作为模板参数
- 4. 获取模板实例的类型?
- 5. 如何实例化模板
- 6. 获取当前模板名称?
- 7. 在模板中获取当前URL kwargs?
- 8. 如何获取模板模板参数的模板参数?
- 9. Mako模板:如何找到当前模板包含的模板的名称?
- 10. XSLT当前模板模式?
- 11. C++模糊模板实例
- 12. 实例化模板
- 13. 单模板实例
- 14. MVC2 - 如何获取模板内的父模型(容器)
- 15. 如何获取Joomla 1.5当前模板的路径?
- 16. 如何获取GAE模板中当前页面的网址
- 17. 如何获取Angularjs上的当前模板?
- 18. 如何获取Django模板中的当前URL?
- 19. 如何获取模板中当前URL的本地化版本?
- 20. 如何获取当前执行的模板文件名?
- 21. 如何获取模板的所有实例?
- 22. 如何获取当前项目模板名称?
- 23. Syncfusion Xamarin sfList - 如何获取列表项模板实例?
- 24. 如何获取表示PHP模板上当前用户的实体?
- 25. C++中的模板实例
- 26. 如何获取Ruby中的当前实例模块
- 27. 从父模板获取价值
- 28. 获取wordpress父模板名称
- 29. 获取模板,模板类型
- 30. D中的模板实例化理解模板,模板混合模板,模板函数和范围
我不得不改变 “VAR视图= Blaze.currentView” 到 “var view = this.view;” 否则 “someTemplate.parentTemplate(2)!= someTemplate.parentTemplate()。parentTemplate()” –
好点,@GraemePyle。我近一年没有使用Blaze(并且不记得当时'TemplateInstance'中是否有'view'可用),但是我接受了你的话并编辑了答案。干杯 –
我可以验证此代码是否可以访问父模板实例。它是实际的实例,包括最初加载时附加到父实例的任何参数。不知道为什么Blaze没有这个官方API?他们只有它,所以你可以访问parentData而不是实例。希望这在未来的Blaze更新中不会中断。 – nearpoint