在Javascript中访问对象文本
此代码是木偶的一个示例:在Javascript中访问对象文本,javascript,backbone.js,marionette,Javascript,Backbone.js,Marionette,此代码是木偶的一个示例: AppLayout = Backbone.Marionette.Layout.extend( { template: "#layout-template", regions: { menu: "#menu", content: "#content" } }); var layout = new AppLayout(); layout.menu.show(new MenuView()); layout
AppLayout = Backbone.Marionette.Layout.extend(
{
template: "#layout-template",
regions:
{
menu: "#menu",
content: "#content"
}
});
var layout = new AppLayout();
layout.menu.show(new MenuView());
layout.content.show(new MainContentView());
最后两行使我困惑。为什么不写:
layout.regions.menu.show(new MenuView());
layout.regions.content.show(new MainContentView());
有人能解释一下为什么layout.menu有效而layout.regions.menu无效吗
如果我想访问模板呢?那不是layout.template吗?模板和区域在布局内的深度相同
以下是木偶代码中的构造函数:
// Ensure the regions are avialable when the `initialize` method
// is called.
constructor: function () {
this._firstRender = true;
this.initializeRegions();
var args = Array.prototype.slice.apply(arguments);
Marionette.ItemView.apply(this, args);
},
我相信它是这样实现的,因为“layout.menu”比“layout.regions.menu”更短、更简单。看起来您希望文字“#菜单”替换为区域管理器对象
创建视图时传入的选项(包括模板)可以在layout.options中找到。因此,在您的示例中,layout.options.template应等于“#layout template”,区域定义散列将位于layout.options.regions。。。仍然是相同的级别。除非示例中有更多内容,否则您将显示类似于
主干.marionete.Layout
方法的内容,然后它不会像您认为的那样访问区域.menu
仅使用您提供的代码,上面的代码实际上创建了一个菜单
属性,该属性随后具有一个显示
属性,因此您的布局
对象实际上如下所示:
layout {
menu : {
show : new MenuView
},
content : {
show : new MainContentView
},
template: "#layout-template",
regions:
{
menu: "#menu",
content: "#content"
}
}
在javascript中,(点)
操作符可用于访问属性的属性,或者如果不存在具有该名称的属性,则它将创建该属性
我不熟悉backbone.js
框架,但我猜它们提供了跳过部分的功能,这意味着上述功能最终将生成此布局对象:
layout {
template: "#layout-template",
regions:
{
menu : {
show : new MenuView
},
content : {
show : new MainContentView
}
}
}
但这只是我的猜测,因为我没有使用主干网
您可以了解有关记录对象并检查它们的更多信息!child{u firstRender:true,regionManagers:Object,menu:Marionette.Region,content:Marionette.Region,render:function…}$el:jQuery.fn.jQuery.init[1]_事件:Object _firstRender:true _监听器id:“l12”_监听器:Object cid:“view11”内容:Marionette.Region el:“content”getEl:函数(选择器){options:objectproto:objectel:div菜单:木偶。Region el:“#menu”getEl:function(选择器){options:objectproto:Object-options:Object-regionManagers:Object-render:function-bound(){proto:SURROTETESORRY,但注释上没有代码视图。将文本包装在后面的记号中,它将呈现代码视图
在这里它位于后面的记号中子{u firstRender:true,RegionManager:Object,menu:Marionette.Region,content:Marionette.Region,render:function…}$el:jQuery.fn.jQuery.init[1]事件:对象firstRender:true listenerId:“l12”listenerId:“对象cid:“视图11”内容:木偶。区域el:“内容”getEl:函数(选择器){选项:对象uuuProto uu:对象el:div菜单:木偶。区域el:“菜单”getEl:函数(选择器){options:Object\uuuuu proto\uuuuuu:Object options:objectregionmanagers:Object render:function bound(){uuuuuuu proto\uuuuuu:subrogate
下面是我获得示例的链接:@kingdrew,所以我是正确的;当你调用layout.render()时
它提供了布局
对所有区域的直接访问
,因此您将得到类似于我的第二个代码示例的结果。我查看了代码,它有以下注释://初始化此布局上的//区域
属性中定义的区域。//hash b的键直接对布局对象上的属性进行编码//例如:regions:{menu:“.menu container”}
//将生成一个布局.menu
对象,它是一个区域//控制.menu容器
DOM元素。注释确认发生了什么。它看起来像扩展({..this stuff..})中的所有内容像@John Mathis说的那样传入,但我在构造函数中没有看到选项对象。我同意“layout.menu”比“layout.regions.menu”更短、更简单,但通常程序员没有能力按照他们想要的方式而不是“它必须是”的方式来制作东西你是说extend参数中的花括号被作为一个选项传递给extend方法吗({…这里的东西…})是如何在构造对象中传递的,但如果它实际上只是传递到extends方法中的一个options对象,我可以理解它是如何成为开发人员想要的。我在问题中添加了构造函数方法。我认为你关于传递内容的想法是有道理的,但我不知道如何传递。它不应该在构造中吗ctor?我正在看代码,我确实看到了一个arguments文本,这是我应该传入的,只是在调用initializeRegions()方法之后才使用它。答案是我的结构只是用于输入。木偶类有自己的结构。