微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

淘汰赛检查表列中的所有复选框 在 isSelected 级别有一个 Document 布尔值在 selectedDocuments 级别维护一个 DocumentsViewModel 可观察的文档数组其他注意事项

如何解决淘汰赛检查表列中的所有复选框 在 isSelected 级别有一个 Document 布尔值在 selectedDocuments 级别维护一个 DocumentsViewModel 可观察的文档数组其他注意事项

我是淘汰赛的新手,并试图实现一个以第一列作为复选框的表格。当我单击标题时,应选中/取消选中整个列。目前,当我单击表格行(所有行都被选中/取消选中)但不在表格标题上时,它可以工作。请让我知道我的代码有什么问题!这是我的部分代码

        <table>
            <tr>
                <th><input type="checkBox" data-bind="click: selectAll"></th>
                <th>Notes</th>
            </tr>
        
            <tbody data-bind="foreach: DocumentRows">
                <tr>
                    <td><input type="checkBox" data-bind="checked: $parent.IsSelected"></td>
             <td><data-bind="text: Notes"></td>
</tr>
            </tbody>
        </table>
        
       // Script.ts
        
        ```
        define(['knockout','jquery','text!./Template'],(ko,$,htmlString) => {
        //Document
        class Document {
                Id: KnockoutObservable<number>;      
                Notes: KnockoutObservable<string>;        
                constructor(data?) {
                    this.Id = ko.observable(0);          
                    this.Notes = ko.observable("").extend({ defaultValue: "" });            
                    if (data != null) {
                        ko.mapping.fromJS(data,{},this);
                    }
                }        
            };
        
        
        //DocumentS VIEW MODEL
        class Documentsviewmodel {
        DocumentRows: KnockoutObservableArray<Document>;
        IsSelected: KnockoutObservable<boolean>;
               
        constructor(params) {
        this.DocumentRows = ko.observableArray([]);
        this.IsSelected = ko.observable(false);//
        this.InitComputed();       
               this.Load();
        }
        InitComputed = () => {
        selectAll = (Document: Documentsviewmodel) => {      
                    var doc = Document.DocumentRows;           
                    ko.utils.arrayForEach(doc(),function (item) {
                        item.IsSelected(true);
                    });
                }
        
        Load = () => {
                    DocumentsApiService.GetDocumentList(this);
                }
        
        }
        
        //API SERVICE
        class DocumentsApiService {
                static GetDocumentList = (model: Documentsviewmodel) => {
                    $.ajax({
                        url: buildUrl(model.LoadListURL,{ 'id': model.ObjectId(),'additionalId': model.AdditionalId() }),type: 'POST',data: ko.mapping.toJSON(model.Filter),contentType: 'application/json; charset=utf-8'
                    }).done(allData => {
                        var mapped = ko.mapping.fromJS(allData,DocumentsMapping);
                        model.DocumentRows(mapped.DocumentRows());
                        model.Filter.TotalCount(mapped.TotalCount());
                        model.Filter.PageIndex(mapped.Filter.PageIndex());
                        CalcCountTableStatus(model.Filter.PageIndex(),model.Filter.PageSize(),model.Filter.TotalCount(),'documents-count-status-line');
                    }).fail(data => {
                        Tscore.OnFailure(data);
                    });
                }
        }
        
            return { viewmodel: Documentsviewmodel,template: htmlString }
        });
        ```

解决方法

在实现这样的选择功能时,通常有两种方法。

isSelected 级别有一个 Document 布尔值

isSelected observable 放在 Document 模型上,而不放在 DocumentsViewModel 上,因为每个文档都必须保存信息,无论它是否被选中。

我猜您正在尝试实施这种方法,但乍一看,您没有将 IsSelected 放在正确的位置。此外,如果您将 IsSelected 移至文档,则在您的视图中不要使用 $parent.IsSelected,而仅使用 IsSelected

selectedDocuments 级别维护一个 DocumentsViewModel 可观察的文档数组

通过这种方式,您可以拥有所有当前选定文档的可观察数组,并在选择所有文档时保持该数组(例如将所有行推送到选择中)

在您看来,您必须使用父引用来确定是否选择了类似于 $parent.selectedDocuments.indexOf($data) >= 0 的文档。

我现在不会涵盖这两种方法的所有优缺点,但如果您可以使用 IsSelected observable 扩展您的文档模型,我建议您使用第一种。

其他注意事项

目前还不清楚您想用 InitComputeds 实现什么目的。你为什么不把这些动作作为你的视图模型类的函数,比如

public selectAll(): void {      
    ko.utils.arrayForEach(this.DocumentRows(),function (item) {
        item.IsSelected(true);
    });
}

如果使用此语法,则必须在视图级别绑定函数,如 $data.selectAll.bind($data)。如果您不想要那样,而只想纯粹地 selectAll,那么您可以使用箭头函数作为这样的字段语法。

public selectAll = ():void => {
    ko.utils.arrayForEach(this.DocumentRows(),function (item) {
        item.IsSelected(true);
    });
}

希望我能给一些有价值的提示。

,

所以,更改后 表头:

<th><input type="checkbox" data-bind="click: selectAll,checked: selectedAll"></th>

表体:

 <td><input type="checkbox" data-bind="checked: IsSelected"></td>

脚本:

    //Document
class Document {
    Id: KnockoutObservable<number>;        
    IsSelected: KnockoutObservable<boolean>;
    constructor(data?) {
        this.Id = ko.observable(0);
        this.Notes = ko.observable("").extend({ defaultValue: "" });          
        this.IsSelected = ko.observable(false);
        if (data != null) {
            ko.mapping.fromJS(data,{},this);
        }
    }
};

//文档查看模型

     class DocumentsViewModel {
    selectedAll: KnockoutObservable<boolean>;
  constructor(params) {
 this.selectedAll = ko.observable(false);
}
 InitComputed = () => {
this.selectedAll = ko.pureComputed({
                read: function () {
                    return this.selectedIds().length === this.DocumentRows().length;
                },write: function (value) {
                    this.selectedIds(value ? this.DocumentRows.slice(0) : []);
                },owner: this
            }
     selectAll = (): void => {
                if (this.selectedIds().length > 0) {
                    this.selectedIds.removeAll();
                    ko.utils.arrayForEach(this.DocumentRows(),function (item) {
                        item.IsSelected(false);
                    });
                } else {
                    ko.utils.arrayPushAll(this.selectedIds(),this.DocumentRows())
                    ko.utils.arrayForEach(this.DocumentRows(),function (item) {
                        item.IsSelected(true);
                    });
                }
            }
    }

当所有行都被选中或未选中时,它不会显示要选中的标题。请问我哪里出错了?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。