【问题标题】:Looping through elements with the same class in Backbone View with .each?使用.each 循环遍历Backbone View 中具有相同类的元素?
【发布时间】:2012-07-06 19:07:04
【问题描述】:

我正在使用 Backbone 和 JQuery,并希望为 create equal height columns as described in method 2 of this link 创建一个 Backbone 视图。 HTML 如下所示:

<div class="container">
 <div  id="leftcolumn" class="set_equal_height"> … Lots Of Content … </div>
 <div id="middlecolumn" class="set_equal_height"> … Lots Of Content … </div>
 <div  id="rightcolumn" class="set_equal_height"> … Lots Of Content … </div>
</div>

我将以下主干视图放在一起,但它无法正常工作,可能是因为使用 .each 的循环不起作用(页面加载没有错误,但列的高度没有被 javascript 修改):

define([
  'jquery',
  'underscore',
  'backbone',
], function($, _, Backbone) {
  var SetEqualHeight = Backbone.View.extend({
    initialize: function() {
      var tallestcolumn = 0;
      console.log(this.$el.height());
      console.log(this.$el.attr("id"));
      this.$el.each(function() {
        currentHeight = $(this).height();
        console.log(currentHeight);
        if(currentHeight > tallestcolumn) {
            tallestcolumn  = currentHeight;
        }
      });
    this.$el.height(tallestcolumn);
    },
  });
  return SetEqualHeight;
});

我在单独的 Wire 规范中定义“el”参数,如下所示:{ el: 'div.set_equal_height' },并且自“console.log(this.$el.height() )" 和 console.log(this.$el.attr("id")) 上面代码中的打印正确。但是“.each”语句中的console.log没有打印出来,表明“.each”存在问题。我查看了this question 并尝试了下划线“_.each”方法,但无法弄清楚如何使用给定类(即 div.set_equal_height)而不是给定数组迭代元素。谁能启发我让 .each 在上面的主干视图中工作?请!!!

仅供参考,以下函数可自行工作(我希望将其合并为 Backbone 视图或视图助手):

function setEqualHeight(columns) {
 var tallestcolumn = 0;
 columns.each(function() {
  currentHeight = $(this).height();
  if(currentHeight > tallestcolumn) {
   tallestcolumn  = currentHeight;
  }
 });
 columns.height(tallestcolumn);
}
$(document).ready(function() {
 setEqualHeight($("div.set_equal_height"));
});

【问题讨论】:

    标签: javascript jquery backbone.js underscore.js


    【解决方案1】:

    我假设你正在用这样的东西实例化你的视图?

    new SetEqualHeight({el: '.container')
    

    如果是这样,这意味着$el 将被设置为您视图内的容器 div。 $(anything).each 将遍历 "anything" 的所有成员 ...但在您的情况下,只有一个成员 ('.container')。

    解决办法是改这一行:

    this.$el.each(function() {
    

    到:

    this.$el.find('.set_equal_height').each(function() {
    

    或者更好(更多 Backbone-y):

    this.$('.set_equal_height').each(function() {
    

    希望对您有所帮助。

    【讨论】:

    • 附带说明,这并不是视图的真正设计目的;这看起来更像是一个帮助/实用功能,或者更好的是一个 jQuery 插件。只是一个想法。
    • 感谢机器鬼的帮助。澄清一下,我已经用 { el: 'div.set_equal_height' } 实例化了 SetEqualHeight (该类有 3 个 div 元素,我希望通过这些元素使用“.each”进行迭代。就像我刚刚的示例函数一样包含在我的问题的底部。我尝试使用 {el: 'container'} 和你的其他建议,但没有任何区别(.each 语句仍然不起作用)。关于你关于使用jQuery 插件而不是主干视图,你能给我介绍一下吗?我是主干/Wire.js 的新手。
    • NP :-) 所以 Backbone 视图被设计为只有一个元素,这就是为什么您的原始代码不起作用的原因。这也是我建议不要使用视图的原因。我建议你只做一个辅助函数,或者如果你想学习一些新东西,你可以学习如何制作一个 jQuery 插件(有很多教程,并不难),然后你可以做 $(' .set_equal_height').setEqualHeight() ... 如果你调用你的插件 setEqualHeight 就是这样。
    • 至于让每个工作,我会检查两件事:1)在你的代码中,检查this.$el实际上是什么;如果您使用的是 Firefox/Firebug 或 Chrome 并打开了开发者工具,您可以通过console.log(this.$el) 进行查看。如果这是您所期望的(您的三个 div),那么 2)检查您的每个 div 运行的频率(再次,可能在其中使用 console.log)......如果这与您看到的元素数量不匹配在this.$el 中出现了严重错误。
    • 感谢机器鬼。我尝试过,但无法使 .each 在骨干网视图中作为辅助函数工作......我决定采用以下方法以避免使用 .each 语句:this.$el.find('.set_equal_height' ).height(Math.max( ($('#left_wrapper').height()), ($('#middle_wrapper').height()), ($('#right_wrapper').height()) );
    猜你喜欢
    • 2011-06-11
    • 1970-01-01
    • 1970-01-01
    • 2011-07-14
    • 2018-12-12
    • 2016-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多