【问题标题】:jQuery templates, apply jQuery plugin to each template itemjQuery 模板,将 jQuery 插件应用到每个模板项
【发布时间】:2012-12-30 15:13:05
【问题描述】:

在我的 web 应用程序中,我需要创建许多具有不同内容(即文本和评级不同,按钮 ID 不同)的相同块(一些文本、评级、一些按钮)。为此,我正在使用 jQuery 模板。

同时,对于评分,我使用“Raty”jQuery 插件。它将评级显示为填充和空星的数量,并且在模板填充数据时应将值传递给它。

但是,在模板处理时,我找不到将插件应用到相应 div 的方法。

这里是代码。

  1. 模板
    <script id="clientTemplate" type="text/html">
        <span class="firstline" id="firstline_${id}">${firstline}
        <div class="star" id="s_${id}" style="cursor: pointer; width: 100px;"></div>
        {{if unescape( alert($data.importance)  )}}{{/if}}
        </span>
    </script>
    
    //警报只是为了检查我们是否可以访问必要的数据
  2. 这是我们需要应用到star div 的内容:
    $(".star").raty({
        half : true,
        score : 2.5,
        readOnly : false,
        click : function(score, evt) {
            if (readonly) {
                return false;
            }
            _id = $(this).attr("id");
            _id = id.replace("s", "");
            _id = _id.trim();
                $.ajax({
                    url : "importancereceive.html",
                    type : "POST",
                    data : {
                    id : _id,
                    importance : score
                },
                success : function(data) {
                    if (data != "1") {
                        alert("Failed to mark plan as completed");
                    }
                },
                error : function(jqXHR, textStatus, errorThrown) {
                    alert("error: " + textStatus);
                    alert("error: " + errorThronwn);
                }
            });
        }
    });
    
    // 我需要用下面的importance 值替换score
  3. 这是数据
    <script>
        var clientData = [ {
            id : 1,
            firstline : "My first line",
            importance : 2.0
        } ];
    </script>
    

如何在生成 star div 时将此插件应用到每个 div?我知道,知道项目的 id 我可以遍历整个 DOM 并将特定的 importance 值设置为特定的 star div,但这意味着多次遍历整个 DOM,这可能会带来问题对于手机/平板电脑,特别是。如果列表变大。有没有办法在生成时将上述内容应用于 div?

【问题讨论】:

  • iterating over the whole DOM a lot of times 是错误的。模板 html 不是在 DOM 中创建的,并且在处理完所有数据后,只会在 DOM 中进行一次插入。在插入之前在生成的 html 上调用插件
  • @charlietfl 问题是我不明白怎么做。也就是说,我可以将插件应用于生成的 HTML ($(".star").raty(...)),但我不明白如何为每个 div 设置正确的分值。顺便说一句,$(this).data(..) 甚至 $(this).attr(..) 在那里不起作用。

标签: jquery jquery-templates


【解决方案1】:

与许多依赖于每个实例的特定数据的插件一样,您必须遍历元素才能将正确的数据应用于每个实例。

如前所述,使用模板将分数存储在 data- 属性中

$('.star').each(function(){
     var score=$(this).data('score')
     $(this).raty({
           half : true,
           score : score,
          /* other options*/
     });  
});

您的模板引擎应该允许您访问它在插入之前生成的 html。

您可以在它生成的 html 上调用插件,也可以在插入 DOM 之前循环遍历该 html。

一些模板引擎在处理这个问题上更灵活一些。这取决于使用的模板系统

【讨论】:

  • 是的,这就是我最终找到的解决方案。
【解决方案2】:

将重要性存储在div的自定义属性中不是一个想法吗?

所以你的模板会变成这样:

<script id="clientTemplate" type="text/html">
    <span class="firstline" id="firstline_${id}">${firstline}
    <div class="star" id="s_${id}" style="cursor: pointer; width: 100px;" data-importance="${importance}"></div>
    {{if unescape( alert($data.importance)  )}}{{/if}}
    </span>
</script>

(我想是这样的,我不懂你的模板语言)

另请参阅Is it OK to add your own attributes to HTML elements?,了解有关创建您自己的属性的更多信息。

然后您可以使用$(this).attr("data-importance") 获取您的重要性。

编辑:然后您可以使用$(this).data("importance") 获取您的重要性。 (见source

【讨论】:

  • 是的,但是在 "raty" 插件中设置为 "score" 的值会被表示为填充星(比如,如果你将它设置为 2.4,你将填充 2.5 星,并且刚刚勾勒出的2.5颗星,就是中间那颗半满)
  • 无论如何,这样我将需要第二次迭代 DOM,并且分数设置逻辑将与模板分离,但我希望它在那里。不过还是谢谢你的回复:)
  • 我试过这个解决方案,但 $(this).data("importance") 返回“未定义”。原来,$(this)[0] 指的是窗口。 “这个”也是如此。
  • @Ibolit 你把$(this)..放在哪里?因为如果它在click 函数内,那么它就有意义..(因为“this”将是触发点击事件的项目)
猜你喜欢
  • 2011-05-10
  • 2013-03-16
  • 2012-10-16
  • 1970-01-01
  • 2023-04-10
  • 2011-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多