【问题标题】:Jquery Mobile Listview Filter not showingJquery Mobile Listview过滤器未显示
【发布时间】:2014-02-10 21:06:27
【问题描述】:

我尝试使用 jQuery mobile 构建一个 Backbone Marionette 应用程序。 我正在使用 Marionette.CollectionView 生成可搜索的 jQuery 移动列表视图。我通过调用 App.mainRegion.show() 来显示该视图。

return Marionette.CollectionView.extend({
    tagName: "ul",
    itemView: UserItemView,
    emptyView: NoUsersView,
    attributes: {
        "data-filter" : "true"
    },

    onShow: function(){
        console.log("OnShow!");
        //console.log($("body").html());
        this.$el.listview();
        $.mobile.changePage("#main");
    }
}

起初,它只显示普通列表。因此,我添加了 $el.listview()。 但是过滤栏仍然没有显示。我发现了一个类似的问题,它指出必须在调用 .listview() 之前附加元素,但我不知道 Marionette 何时附加 $el。

当我只使用 Backbone 时,我可以简单地调用 "append(template).trigger("create")" 但触发器似乎在这里不起作用。

我应该怎么做才能使过滤器显示?

编辑:这是视图渲染方法生成的列表视图(添加了“数据角色”属性):

<ul data-role="listview" data-filter="true" class="ui-listview">
    <li class="ui-li-has-alt ui-first-child ui-last-child">
        <a href="#/users/details/hqpmy4j16z11bxfh9f2x" class="ui-btn"> 
            <h2>Thomas Davis</h2> 
            <div class="ui-li-aside">Age: 12</div>
        </a>
        <a href="#/users/edit/hqpmy4j16z11bxfh9f2x" data-icon="edit" title="" class="ui-btn ui-btn-icon-notext ui-icon-edit"></a>
    </li>
</ul>

过滤栏不显示。

【问题讨论】:

  • 您使用的是哪个 jQM 版本?你能做一个小提琴吗?
  • 我使用的是 1.4.0 版本。我会尝试创建一个小提琴
  • 对不起,我无法让小提琴正常工作:/
  • 输出看起来有效,在 jsfiddle 上独立工作......没有更多内容,很难看出为什么它不起作用!!!
  • 该输出是一个有效的普通列表视图。因为它是运行时输出,它应该包含过滤器栏中的 ,但它没有。 listview 的动态初始化(.listview() 方法)肯定有一些问题。调用它的地点和时间,或者我错过了一些东西。我不知道我应该发布什么进一步的代码。

标签: javascript jquery-mobile backbone.js marionette jquery-mobile-listview


【解决方案1】:

使用 CollectionView 或 CompositeView 时,您需要使用 appendHtml 函数添加子 ItemView。

appendHtml: function (collectionView, itemView) {
    collectionView.$el.append(itemView.el);
}

这是文档https://github.com/marionettejs/backbone.marionette/blob/master/docs/marionette.collectionview.md#collectionviews-appendhtml

【讨论】:

  • 这对我的问题有什么帮助?我尝试从该函数调用 trigger("create") 和 .listview(),但过滤器仍然不会出现。
  • 对不起,也许我弄错了,我虽然你问木偶是如何或何时附加元素的?在 CollectionView 中,它默认通过 appendHtml 方法完成,您也可以覆盖该方法。
【解决方案2】:

我认为您缺少 data-role 属性。

为了让过滤器起作用,你的 ul 元素的标记希望看起来像这样。

<ul data-role="listview" data-filter="true">

目前你的视图只会渲染这个。

<ul data-filter="true">

尝试将 data-role 属性添加到您的视图中。

return Marionette.CollectionView.extend({
    tagName: "ul",
    itemView: UserItemView,
    emptyView: NoUsersView,
    attributes: {
        "data-role" : "listview",
        "data-filter" : "true"
    },

    onShow: function(){
        console.log("OnShow!");
        //console.log($("body").html());
        this.$el.listview();
        $.mobile.changePage("#main");
    }
}

【讨论】:

  • 我最初有它,但我删除了它,因为调用 .listview() 方法会产生相同的结果,无论是否有数据角色。即使我添加它,它仍然不显示过滤器栏。
  • 我认为 .listview() 没有为元素添加任何属性,它不适合我。
  • 从你的视图中生成了什么,你能分享一下吗?
【解决方案3】:

我解决了这个问题。您不能使用 .listview() 函数创建过滤器栏。 实现这一点的唯一方法是触发 create-Event。

$("#element").trigger("create");

就我而言,这也不起作用。问题是当我实际需要调用列表视图的父元素的触发器(“创建”)时,我正在调用列表视图的触发器(“创建”),例如

$("#this-is-the-wrapper-of-listview").trigger("create");

我想知道为什么当我有一个正常的 Backbone-View 时 trigger-create 会起作用,这就是原因。

【讨论】:

  • $(".ui-listview").listview()$("ul parent").enhanceWithin(),因为您使用的函数 si 已弃用并将在 jQM 1.4 中删除
  • 我目前在 1.4.0 中使用它,它工作得非常好。
  • 它有效,但稍后将被删除。所以最好使用上述功能,以免在升级 jQM 时遇到任何问题 :)
  • .listview() 没有用,但 enhanceWithin() 工作正常,所以我没有理由再使用 trigger("create") 了。感谢您的信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-08
相关资源
最近更新 更多