当前位置: 首页 > 知识库问答 >
问题:

主干和木偶中的额外包装

周飞语
2023-03-14

使用骨干和木偶,我创建了一个新的布局,进入我页面上的主要内容div。布局看起来像这样:

<div id='dash-sidebar'>
    <div id='dash-profile'></div>
    <div id='dash-nav'></div> 
</div>
<div id='dash-content'></div>

问题是,当我渲染布局时,骨干会自动将其包装在div中,然后将其放入主内容div中,如下所示:

<div id='main-content'>    
  <div>
    <div id='dash-sidebar'>
      <div id='dash-profile'></div>
       <div id='dash-nav'></div> 
    </div>
    <div id='dash-content'></div>
  </div>
</div>

我知道我可以使用tagName更改元素,但是否可以避免完全包装模板,直接将其插入页面上的主内容div中?

共有3个答案

夏侯渊
2023-03-14

更新:木偶。布局是主干视图的扩展,因此这是正常行为,请参阅主干文档:

“el”属性引用在浏览器中创建的DOM对象。每根脊梁。js视图有一个“el”属性,如果未定义,则为主干。js将构造自己的div元素,它是一个空的div元素。

所以我之前的回答与你的问题无关,对不起。

更新:

在Backbone gitHub中发现了一个关于这个主题的问题546(wich被关闭了),jashkenas发布了这条评论来解释为什么它不容易实现:

使用主干视图的很大一部分优势在于,它们的元素在任何时候都是可用的——不管是否呈现了模板(许多视图都有多个模板)——不管视图是否存在于DOM中。

这允许您创建视图并将其添加到DOM中,稍后进行渲染,并确保所有事件都已正确绑定(因为它们是从view.el委派的)。

如果你能想出一个好的策略,允许视图拥有“完整”的模板,同时保留上述特征。。。然后,让我们来讨论它——但它必须允许根元素存在,而不必呈现模板的内容(这可能取决于稍后可能不会到达的数据),并且它必须允许一个视图轻松拥有多个模板。

欧阳绪
2023-03-14

编辑3:警告!这个答案可能已经过时了。我收到一条评论,说这个答案不再有效,也没有时间调查(我个人不使用这种方法)。

我喜欢使用Twitter/Bootstrap作为我的UI库,由于默认的标记包装(特别是

经过一些挖掘,我在区域的木偶文档中找到了一些关于视图如何附加el的内容。主干从各种视图属性构建el,并使构建的元素保持最新,以便随时呈现。所以我想,如果视图。el是父对象,为什么不使用HTML内容呢?木偶网还提供了一种创建自定义区域的方法

我可以通过创建一个自定义的区域,使用一个覆盖的打开函数来运行一切。这样,我就可以指定哪些区域需要用标记进行换行,哪些区域不需要。在下面的示例代码段中,我创建了我的自定义非包装区域NowrapRegion),并将其用于我的布局MyLayout

var NowrapRegion = Marionette.Region.extend({
  open: function(view){
    this.$el.html(view.$el.html());
  }
});

var MyLayout = Marionette.Layout.extend({
  template: templates.mylayout,
  regions: {
    foo: '#foo',
    columns: '#columns', //thead
    rows: { selector: '#rows', regionType: NowrapRegion } //tbody
  }
});

繁荣我想要的时候包装,不想要的时候不要。

编辑:这似乎会影响在*视图级别应用的事件。我还没有调查过,但请注意,他们似乎没有被触发。

我不确定这是否是一种“正确”的方式。如果@derick bailey看到这一点,我欢迎他提供任何反馈。

编辑2:@chris-neale建议如下,我还没有证实这一点,但它似乎是合理的。谢谢!

在子节点上使用深度克隆将维护事件和数据,而不是在视图中复制html。

var NowrapRegion = Marionette.Region.extend({
  open: function(view){
    view.$el.children().clone(true).appendTo(this.$el);
  }
});

邓建柏
2023-03-14

每个主干视图必须由单个元素表示。您的第一个HTML块有两个元素,这就是为什么如果不首先将其包装到外部div中,它就不能由视图表示。

你能重构你的布局,包括主内容区域吗?然后Layout的el将对应于整个外部div。

另一件要尝试的事情是使用骨干。View的setElement()方法重写外部div的创建,并手动为View中的元素注入所需的超文本标记语言。类似的东西:

onRender: function() {
    this.setElement( /* the HTML you want for your layout */ );
}

但是,如果传入有两个父元素而不是只有一个父元素的超文本标记语言,我不确定这将如何工作。

 类似资料:
  • 问题内容: 有人知道如何获取元素的或文本吗?甚至更好;如何单击具有特定元素的元素?这就是普通JavaScript的工作方式: 在此先感谢您的帮助! 问题答案: 这就是我获取innerHTML的方式:

  • 今天我开始学习ReactJS,一个小时后我就开始面对这个问题。。我想在页面上的div中插入一个有两行的组件。下面是我正在做的一个简化示例。 我有一个html: 渲染功能如下: 下面我调用渲染: 生成的HTML如下所示: 我不是一个非常高兴的问题,这个问题迫使我将所有内容都打包在一个div“DeadSimpleComponent”中。在没有显式DOM操作的情况下,最好且简单的解决方法是什么? 201

  • 在ApacheFelixOSGi框架中,配置文件提供了在Felix生态系统中包含其他系统包的选项。Felix配置中的行如下所示: 我将当前的OSGi框架从Felix切换到EclipseEquinox,我发现我的一个捆绑包依赖于包,但在Equinox的(模糊的)配置文档中找不到任何与Felix中的设置等效的东西。有人知道Equinox的方式包括这个额外的包吗? 如果您正在查看我在上面共享的链接(到E

  • 问题内容: 我试图将变量传递到Puppeteer中的函数中,但是当我使用以下非常简单的示例时,该变量未定义。 我是Puppeteer的新手,找不到任何可构建的示例,因此我需要帮助将该变量传递到函数中,以便在内部使用它。 问题答案: 您必须像这样将变量作为参数传递给:

  • 我被要求评估Robotframework,并对我所看到的大部分情况感到满意。然而,为了让它成为一个可行的选择,我需要它在Firefox中工作。 提线木偶功能在我的Ruby/Capybara环境中是一个问题,我能够关闭它。 在Robot/Python 2.7/FF44.0中获取相同的内容会在两个方向上产生错误。 当提线木偶上演时: 我明白了: 我们的产品摇滚失败WebDriverException:

  • 我需要解析一个一列的CSV文件,它不仅有额外的逗号,而且一些名称还包括额外的引号。我已经看过了,并阅读了之前的其他问题,最好的答案之一是阿钦蒂亚·杰哈的答案。然而,这种解决方案似乎在我的情况下不起作用。一个例子是这个名字 正在打印为: 它在正确的地方分裂,并且正在处理额外的逗号,但它没有击中额外的引号,并且现在也在那里分裂,所以

  • 运行新页时,必须使用函数指定视口的大小:

  • Marcin Grzejszczak谈论Spring Cloud Sleuth和Zipkin 点击此处查看视频