使用foreach呈现创建自定义敲除绑定(用于jquery mobile listview)

使用foreach呈现创建自定义敲除绑定(用于jquery mobile listview),listview,knockout.js,custom-binding,jquery-mobile,Listview,Knockout.js,Custom Binding,Jquery Mobile,使用jquerymobile和knockout,我试图创建一个定制绑定,如下所示 <ul data-bind="listview: observablearray"> <li data-bind="text: text"></li> </ul> 其中,listview绑定将首先像foreach绑定一样,然后对其应用$(element).listview()(或者更新时应用$(element).listview('refresh')

使用jquerymobile和knockout,我试图创建一个定制绑定,如下所示

<ul data-bind="listview: observablearray">
    <li data-bind="text: text"></li>
</ul>
其中,listview绑定将首先像foreach绑定一样,然后对其应用$(element).listview()(或者更新时应用$(element).listview('refresh'))

我尝试了以下方法天真地模仿foreach绑定:

ko.bindingHandlers.listview = {
  init: function (element, valueAccessor) {
    var listview = $(element);
    listview.listview();
  },
  update: function (element, valueAccessor) {
    var listview = $(element);
    setTimeout(function () {
      listview.html('');
      var items = valueAccessor().list;
      var link = valueAccessor().link;
      var text = valueAccessor().text;
      var icon = valueAccessor().icon;
      $.each(ko.utils.unwrapObservable(items) || [], function (i, item) {
        var li = $('<li></li>').css({
          height: '44px'
        })
        var a;
        if (link) {
          a = $('<a href="#"></a>').click(function () {
            link(item)
          });
          li.append(a);
        }
        if (icon) {
          (a || li).append($('<img />').attr('src', icon(item)).addClass('ui-li-icon'));
        }
        if (text) {
          (a || li).append($('<span></span>').text(item[text]));
        }
        listview.append(li);
      });
      listview.listview('refresh')
    }, 0);
  }
};
ko.bindingHandlers.listview={
init:函数(元素、值访问器){
var listview=$(元素);
listview.listview();
},
更新:函数(元素、值访问器){
var listview=$(元素);
setTimeout(函数(){
html(“”);
var items=valueAccessor().list;
var link=valueAccessor().link;
var text=valueAccessor().text;
var icon=valueAccessor().icon;
$每个(ko.utils.unwrapobbservable(items)| |[],函数(i,item){
var li=$(“
  • ”).css({ 高度:'44px' }) var a; 如果(链接){ a=$('')。单击(函数(){ 链接(项目) }); li.附加(a); } 如果(图标){ (a | | li).append($('').text(项目[text]); } 追加(li); }); listview.listview(“刷新”) }, 0); } };
    不幸的是,这不仅是一个不使用模板的糟糕实现,而且还通过init上的一个错误:

    未捕获类型错误:无法读取属性“jQuery19101983379740267992” 未定义的


    提前谢谢

    您可以使用绑定调用内部敲除绑定

    在你的情况下,这应该是有效的

    ko.bindingHandlers.listview={
    init:function(元素、valueAccessor、allBindingsAccessor、viewModel、bindingContext){
    var res=ko.bindingHandlers.foreach.init(元素,valueAccessor()['listview']);
    $(元素).listview();
    返回res;
    },
    更新:函数(元素、valueAccessor、allBindingsAccessor、viewModel、bindingContext){
    var res=ko.bindingHandlers.foreach.update(元素,valueAccessor()['listview'],allBindingsAccessor,viewModel,bindingContext);
    $(元素).listview(“刷新”);
    返回res;
    }
    };
    

    自己呈现模板是一个相当大的挑战,最好使用内部“模板”绑定。“foreach”绑定也会这样做。查看knockoutjs代码,了解它是如何完成的。

    对我来说,使用dinamic jQueryMobile listview最快捷、最优雅的方法是订阅模型更改,类似于以下内容:

    viewModel.products.subscribe(function() {
        jQuery("#productsList").listview("refresh");  
    });
    

    也许这个()可以帮助您…它确实可以,尽管我对knockout的内部工作方式感兴趣,特别是如何手动呈现匿名模板