Knockout.js 淘汰自定义元素模板取决于可观察对象

Knockout.js 淘汰自定义元素模板取决于可观察对象,knockout.js,knockout-3.0,Knockout.js,Knockout 3.0,在阅读了《新淘汰赛3.2》之后,我试图做一些有用的东西,但并没有真正直截了当地去做 我尝试创建一个分页元素,它将具有一个当前元素,并允许用户从currentpage-2到currentpage+2选择页面 问题是,与KO示例相比,我的模板依赖于可观察对象。所以我试图通过创建pureComputed并在其中生成模板来克服它。但这不允许我在单击元素时添加回调 ko.components.register('pagination', { viewModel: function(params) {

在阅读了《新淘汰赛3.2》之后,我试图做一些有用的东西,但并没有真正直截了当地去做

我尝试创建一个分页元素,它将具有一个当前元素,并允许用户从currentpage-2到currentpage+2选择页面

问题是,与KO示例相比,我的模板依赖于可观察对象。所以我试图通过创建pureComputed并在其中生成模板来克服它。但这不允许我在单击元素时添加回调

ko.components.register('pagination', {
viewModel: function(params) {
    var self = this;
    this.page       = ko.observable(5);
    this.maxPage    = ko.observable(6);
    this.callback   = function(i){
        console.log(i);
    }
    this.template   = ko.pureComputed(function() {
        var page    = self.page(),
            minTmp  = page - 2,
            min     = minTmp < 1 ? 1 : minTmp,
            maxTmp  = page + 2,
            max     = maxTmp > self.maxPage() ? self.maxPage() : maxTmp,
            i, html = '';

        for (i = min; i <= max; i++){
            html += (i === page) ? '<li class="active"><a>'+i+'</a>':
            '<li data-bind="click: function(i){ callback(i) }"><a>'+i+'</a>';
        }
        return '<li><a href="#">«</a></li>'+ html +'<li><a href="#">»</a></li>';
    });
},
template: '<ul class="pagination pagination-sm" data-bind="html: template"></ul>'
});
ko.components.register('pagination'{
viewModel:函数(参数){
var self=这个;
this.page=ko.可观察(5);
this.maxPage=ko.可观察(6);
this.callback=函数(i){
控制台日志(i);
}
this.template=ko.pureComputed(函数(){
var page=self.page(),
minTmp=第2页,
min=minTmp<1?1:minTmp,
maxTmp=第+2页,
max=maxTmp>self.maxPage()?self.maxPage():maxTmp,
i、 html='';

对于(i=min;i嗯,如果模板依赖于观察值,请尝试在模板本身中使用这些观察值,而不是在for循环中构建模板:

ko.components.register('pagination', {
    viewModel: function(params) {
        var self = this;
        this.min        = ko.observable(params.min || 1);
        this.max        = ko.observable(params.max || 10);
        this.page       = ko.observable(5);
        this.maxPage    = ko.observable(6);
        this.callback   = function(i){
            console.log(i);
        };
    },
    template: '<ul class="pagination pagination-sm" data-bind="foreach: new Array(max() - min())"><li data-bind="css: { active: $index() + 1 === $parent.page() }, click: function() { $parent.callback($index() + 1) }"><a data-bind="text: $index() + 1"></a></ul>'
});

ko.applyBindings();
ko.components.register('pagination'{
viewModel:函数(参数){
var self=这个;
this.min=ko.可观察(params.min | 1);
this.max=ko.可观察(params.max | 10);
this.page=ko.可观察(5);
this.maxPage=ko.可观察(6);
this.callback=函数(i){
控制台日志(i);
};
},
模板:'
  • 编辑:

    .一种方法是定义元素:

    <template id="pagination-tpl">
        <ul class="pagination pagination-sm" data-bind="foreach: new Array(max() - min())">
            <li data-bind="css: { active: $index() + 1 === $parent.page() }, click: function() { $parent.page($index() + 1) }">
                <a data-bind="text: $index() + 1"></a>
            </li>
        </ul>
    </template>
    
    
    数据绑定:新数组(max()-min())>
    

  • 谢谢。有没有一种方法可以做到这一点,而不必将所有内容都放在模板中?在html/模板中定义UI逻辑是一种非常好的方法,因此这可能是首选方法。但是,还有其他方法可以定义/指定模板;请参阅我的编辑。