4

所以,标题是不言自明的。我正在尝试使用 jQuery mobile 和 Handlebars,但我遇到了表格的 CSS 或由把手生成的列表视图的问题。似乎CSS被忽略了。

编辑:这是一个实际的例子:http: //jsbin.com/adurar/1/edit

在该<head>部分中,我有以下代码:

<script id="articles-template" type="text/x-handlebars-template">
<ul data-role="listview" data-autodividers="true"  data-filter="true" data-inset="true">
  {{#entries}} 
    <li><a href="#" onClick="">{{msg}}</a></li>
  {{/entries}}
</ul>
</script>

HTML 的主体是非常直接的 jquery mobile:

<div data-role="page" data-theme="b">

    <div data-role="header">
        <h1>Page Title</h1>
    </div><!-- /header -->

    <div data-role="content">   
        <p>
          <div id="articleHandlebars" data-demo-html="true"></div>
        </p>        
    </div><!-- /content -->

    <div data-role="footer">
        <h4>Page Footer</h4>
    </div><!-- /footer -->
</div><!-- /page -->

在 .js 文件中,我有以下代码:

function showData(data)
{
  var source   = $("#articles-template").html();
  var template = Handlebars.compile(source);
  var html = template(data);
  $("#articleHandlebars").html(html);   
 }

我也尝试添加这个无济于事:

$("#articleHandlebars").trigger('create');
$("#articleHandlebars").listview('refresh');

非常感谢任何形式的帮助!

4

4 回答 4

5

您的代码中几乎没有错误,我将用解决方案解释所有内容。

代码更改:

让我们稍微改变一下你的页面:

<div data-role="page" data-theme="b" id="listview-page">

    <div data-role="header">
        <h1>Page Title</h1>
    </div><!-- /header -->

    <div data-role="content"  id="listview-content">   
        <p>
          <div id="articleHandlebars" data-demo-html="true"></div>
        </p>        
    </div><!-- /content -->

    <div data-role="footer">
        <h4>Page Footer</h4>
    </div><!-- /footer -->
</div><!-- /page -->

我已将 id listview-page添加到页面容器,并将 id listview-content添加到内容容器。我们将在我们的解决方案中使用它。

解决方案:

首先,这一行:

$("#articleHandlebars").listview('refresh');

不起作用,您只能在列表视图小部件或具有属性 data-role="listview" 的 ul elemenet 上触发列表视图刷新。如果 ul 元素直接附加到 div #articleHandlebars 试试这个:

$("#articleHandlebars ul").listview('refresh');

或者深入直到达到 ul 标签。但是根据我的经验,它不会起作用,因为您的列表视图是动态生成的,因此您需要先初始化列表视图,然后才能刷新它。因此,如果顶级解决方案不起作用,请尝试以下解决方案:

$("#articleHandlebars ul").listview().listview('refresh');

第一个 listview() 调用将初始化小部件,第二个 listview('refresh') 将设置它的样式。

第二件事,您正在使用:

$("#articleHandlebars").trigger('create');

它通常应该在内容 div 上触发,因此如果 listview('refresh') 不起作用,请尝试以下操作:

$("#listview-content").trigger('create');

仅当您像我在此答案开始时建议的那样更改了页面时,这才有效。或者最坏的情况试试这个:

$("#listview-page").trigger('pagecreate');

编辑 :

我已经修复了您的示例:http: //jsbin.com/ivezat/1/edit

HTML:

<!DOCTYPE html>
<html>
<head>
<link href="http://code.jquery.com/mobile/latest/jquery.mobile.css" rel="stylesheet" type="text/css" />
<script src="http://code.jquery.com/jquery-1.6.4.min.js"></script>
  <script src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
<script src="http://code.jquery.com/mobile/latest/jquery.mobile.js"></script>

        <script type="text/javascript" src="http://cloud.github.com/downloads/wycats/handlebars.js/handlebars-1.0.rc.1.js"></script>

<script id="articles-template" type="text/x-handlebars-template">
<ul id="listv" data-role="listview" data-autodividers="true"  data-filter="true" data-inset="true">
  {{#entries}} 
    <li><a href="#" onClick="alert('{{title}}')">{{title}}</a></li>
  {{/entries}}
</ul>
</script>   

<meta charset=utf-8 />
<title>JS Bin</title>
</head>
<body>
<div data-role="page" data-theme="b" id="listview-page">

    <div data-role="header">
        <h1>Page Title</h1>
    </div><!-- /header -->

    <div data-role="content" id="listview-content"> 
        <p>
          <div id="articleHandlebars" data-demo-html="true"></div>
        </p>        
    </div><!-- /content -->

    <div data-role="footer">
        <h4>Page Footer</h4>
    </div><!-- /footer -->
</div><!-- /page -->


</body>
</html>

Javascript:

$(document).on('pagebeforeshow', '#listview-page', function(){
    parseRSS(); 
});

function parseRSS() {
      var articles = { entries: []};
      for (var i = 0; i <=4; i++)
      {
        var obj = {
          title: "test" + i
        };
        articles.entries.push(obj);
      }
      showData(articles);

}

function showData(data)
{
 var source   = $("#articles-template").html();
  var template = Handlebars.compile(source);
  var html = template(data);
  $("#articleHandlebars").html(html);   
  $("#articleHandlebars ul").listview().listview('refresh');
 }
于 2013-04-08T20:02:17.413 回答
0

附加 JSON 响应后使用此语法

$("your_list_view_id").listview('refresh');

于 2013-07-25T02:23:31.033 回答
0

根据我们在实际项目中使用把手(1.3.0)和jQuery Mobile(1.4.1)后的经验,请注意:

从技术上讲,它按预期工作,您可以使用 jQuery Mobile 提供的任何组件实现您需要的任何 UI。

但是我们遇到了一些性能问题,这是由于客户端需要双重渲染而发生的。

  1. 我们使用车把模板来生成标记,就像 jQuery Mobile 文档中建议的那样。
  2. 在这个渲染过程之后,我们.trigger("create");用来启动 jQuery Mobile 的“增强”过程。

使用这种方法在浏览器中的性能并不好,即使后端的 REST 服务响应非常快(在我们的例子中为 20-35 毫秒)。

于 2014-02-24T13:25:46.463 回答
0

工作示例刷新了两次。页面,然后是列表视图。一个更好的(对我来说)解决方案是将标签放在模板之外。所以你有id,刷新listview就可以了。

<!DOCTYPE html> 
<html>

<head>
<meta charset="utf-8">
<link href="http://code.jquery.com/mobile/latest/jquery.mobile.css" rel="stylesheet" type="text/css" />
<script src="http://code.jquery.com/jquery-1.6.4.min.js"></script>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
<script src="http://code.jquery.com/mobile/latest/jquery.mobile.js"></script>
<script type="text/javascript" src="http://cloud.github.com/downloads/wycats/handlebars.js/handlebars-1.0.rc.1.js"></script>
<script>
$(document).bind('pageinit', function () {
    $.mobile.defaultPageTransition = 'none';
});
</script>
</head>     
<body> 

<div data-role="page" data-theme="d"> 
<div role="main" class="ui-content" id="Content">

<button onclick="foo()">render listview</button>

<ul data-role="listview" data-inset="true" id="listviewMenu">
</ul>

<script id="templateLV" type="text/x-handlebars-template">
    {{#.}}<li><a href="#" id="{{cat}}" class="nodeLevel1">{{label}}</a></li>{{/.}}      
</script>

</div><!-- .ui-content -->
</div><!-- Page body -->

<script>
function foo()
{
    var source   = $("#templateLV").html();
    var template = Handlebars.compile(source);
    var context = [{cat: "sample1", label: "Label One"}, {cat: "sample2", label: "Label Two"}]
    var html    = template(context);
    $("#listviewMenu").html(html);
    $('#listviewMenu').listview('refresh');
}
</script>
</body>
</html>

所以那里,你只刷新一次,刷新整个页面时没有那种屏幕闪烁的效果

于 2014-08-22T17:04:33.907 回答