使用foreach呈现创建自定义敲除绑定(用于jquery mobile listview)
使用jquerymobile和knockout,我试图创建一个定制绑定,如下所示使用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')
<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的内部工作方式感兴趣,特别是如何手动呈现匿名模板