gpt4 book ai didi

javascript - 主干 View 嵌套

转载 作者:数据小太阳 更新时间:2023-10-29 04:13:03 25 4
gpt4 key购买 nike

我在原地转圈,似乎在我当前实现 backbone.js 的应用程序中遗漏了一些东西。问题是我有一个主 AppView,它为页面初始化各种 subview (图形、信息表等)。我的愿望是能够根据导航时传递的参数标志更改页面布局。

我遇到的情况是, subview 引用了模板呈现后的 dom 元素,但在主 AppView 初始化过程中无法访问这些元素。因此,主要问题是如何确保为每个事件绑定(bind)过程设置正确的 dom 元素以正确设置?

使用以下代码,如果我有一个事件绑定(bind)到我的 LayoutView 中的模型更改,则会呈现布局,但后续 View 不会正确呈现。我摆弄过的一些东西是将所有 View “.el”值设置为 html 结构中的静态元素。这会导致渲染发生,尽管这似乎脱离了使用“.el”提供的良好范围界定能力。

示例代码:

//Wrapped in jquery.ready() function...
//View Code
GraphView = Backbone.View.extend({ // init, model bind, template, supporting functions});

TableView = Backbone.View.extend({ // init, model bind, template, supporting functions});

LayoutView = Backbone.view.extend({
initialize: function() {
this.model.bind('change:version', this.render, this);
},
templateA = _.template($('#main-template').html()),
templateB = _.template($('#secondary-template').html()),
render: function() {
if ('main' == this.model.get('version')) {
this.el.html(this.templateA());
} else {
this.el.html(this.templateB());
}
},
});

MainView = Backbone.View.extend({
initialize: function() {
this.layoutView = new LayoutView({
el: $('#layoutContainer'),
model: layout,
});
this.graphView = new GraphView({
el: $('.graphContainer'),
model: graph
});
this.tableView = new TableView({
el: $('#dataTableContainer',
model: dataSet
});
},
});

// Model Code
Layout = Backbone.Model.extend({
defaults: {
version: 'main',
},
});

Graph = Backbone.Model.extend({});
dataSet = Backbone.Model.extend({});

// Router code...

// Fire off the app
AppView = new MainView($('#appContainer'));
// Create route, start up backbone history

HTML:为简单起见,我只是重新排列了两种布局之间的 div。

<html>
<head>
<!-- include above js and backbone dependancies -->
</head>
<body>
<script type="text/template" id="main-template">
<div class="graphContainer"></div>
<div class="dataTableContainer"></div>
<div>Some other stuff to identify that it's the main template</div>
</script>
<script type="text/template" id="secondary-template">
<div class="dataTableContainer"></div>
<div>Rock on layout version two!</div>
<div class="graphContainer"></div>
</script>
<div id="appContainer">
<div id="nav">
<a href="#layout/main">See Layout One</a>
<a href="#layout/secondary">See Layout Two</a>
</div>
<div id="layoutContainer"></div>
</div>
</body>
</html>

感谢你们任何人可能拥有的见解/意见。谢谢!

最佳答案

您的示例中缺少很多代码,但如果我理解正确,问题是您正在尝试呈现依赖于 LayoutView 生成的 HTML 的 View ,但是在更新模型时异步选择布局,所以 LayoutView还没有被渲染。

有多种方法(与几乎所有与 Backbone 相关的东西一样),但总的来说:

  • 如果我有依赖于呈现“父” View 的 View ,我将负责在父 View 中实例化和呈现这些 View - 在本例中为 LayoutView , 不是 MainView .

  • 如果父级异步呈现,则需要在回调中执行该实例化 - 此处为 LayoutView.render()方法。

所以我可能会这样构造代码:

LayoutView = Backbone.view.extend({
initialize: function() {
this.model.bind('change:version', this.render, this);
// you probably want to call this.model.fetch() here, right?
},
templateA: _.template($('#main-template').html()),
templateB: _.template($('#secondary-template').html()),
render: function() {
if ('main' == this.model.get('version')) {
this.el.html(this.templateA());
} else {
this.el.html(this.templateB());
}
// now instantiate and render subviews
this.graphView = new GraphView({
// note that I'm using this.$ to help scope the element
el: this.$('.graphContainer'),
model: graph
});
this.tableView = new TableView({
el: this.$('.dataTableContainer'),
model: dataSet
});
// you probably need to call graphView.render()
// and tableView.render(), unless you do that
// in their initialize() functions
},
});

请注意,您不必传入 el在实例化时 - 您可以在 initialize() 中实例化 subview , 并设置 el属性(property) subview.render() .您甚至可以在 MainView.initialize() 中实例化,就像你现在所做的那样,并将 View 传递给 LayoutView异步渲染。但我认为上述方法可能更清洁。

关于javascript - 主干 View 嵌套,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7654543/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com