YUI DataTable自定义sortFunction问题

发布于 2024-09-02 06:37:02 字数 4444 浏览 3 评论 0原文

我正在使用带有自定义 sortFunction 的 YUI DataTable,该自定义 sortFunction 会去除 HTML 代码,仅根据文本内容进行排序,而不是根据带有 HTML 标签的整个字符串进行排序。我遇到的问题是我需要在三个不同的列上使用此排序函数,并且我似乎无法将“字段”值传递到我的排序函数中。我想使用“字段”而不是命名列 - 因为我想对所有三列使用相同的排序函数,而不是像下面的代码中那样重复三次。当我传入“field”时,排序在浏览器中停止或挂起,并且“field”似乎是“未定义”。有什么想法吗?

YAHOO.util.Event.addListener(window, "load", function() {

    var sortProject = function(a, b, desc) {
        var col = "project";
        // Deal with empty values 
            if(!YAHOO.lang.isValue(a)) {
                return (!YAHOO.lang.isValue(b)) ? 0 : 1;
            } 
            else if(!YAHOO.lang.isValue(b)) {
                return -1;
            }
        var comp = YAHOO.util.Sort.compare;
        var tagregex = /<[^>]*>/g;
        var aString = a.getData(col).replace(tagregex, "");
        var bString = b.getData(col).replace(tagregex, "");
        var compString = comp(aString, bString, desc);
        return compString;
    };

    var sortArchitect = function(a, b, desc) {
        var col = "architect"
        // Deal with empty values 
            if(!YAHOO.lang.isValue(a)) {
                return (!YAHOO.lang.isValue(b)) ? 0 : 1;
            }
            else if(!YAHOO.lang.isValue(b)) {
                return -1;
            }
        var comp = YAHOO.util.Sort.compare;
        var tagregex = /<[^>]*>/g;
        var aString = a.getData(col).replace(tagregex, "");
        var bString = b.getData(col).replace(tagregex, "");
        var compString = comp(aString, bString, desc);
        return compString;
    };

    var sortStatus = function(a, b, desc) {
        var col = "status"
        // Deal with empty values 
            if(!YAHOO.lang.isValue(a)) {
                return (!YAHOO.lang.isValue(b)) ? 0 : 1;
            }
            else if(!YAHOO.lang.isValue(b)) {
                return -1;
            }
        var comp = YAHOO.util.Sort.compare;
        var tagregex = /<[^>]*>/g;
        var aString = a.getData(col).replace(tagregex, "");
        var bString = b.getData(col).replace(tagregex, "");
        var compString = comp(aString, bString, desc);
        return compString;
    };

    var myColumnDefs = [
        {key:"design",label:"<span class='dtTitleText'>Design</span>", width:105, formatter:YAHOO.widget.DataTable.formatDate, sortable:true},
        {key:"status",label:"<span class='dtTitleText'>Status</span> <sup>1</sup>", sortable:true, width:62, sortOptions:{sortFunction:sortStatus}},
        {key:"project",label:"<span class='dtTitleText'>Project Name</span>", sortable:true, width:105, sortOptions:{sortFunction:sortProject}},
        {key:"address",label:"<span class='dtTitleTextNoSort'>Address</span>", width:80, sortable:false},
        {key:"city",label:"<span class='dtTitleText'>City</span>", width:80, sortable:true},
        {key:"state",label:"<span class='dtTitleText'>State</span>", width:45, sortable:true},
        {key:"type",label:"<span class='dtTitleText'>Building <br />Type</span>", width:75, sortable:true},
        {key:"feet",label:"<span class='dtTitleText'>Gross <br />Sq. Ft.</span>", width:55, formatter:YAHOO.widget.DataTable.formatNumber,sortable:true},
        {key:"owner",label:"<span class='dtTitleText'>Building <br />Owner</span>", width:95, sortable:true},
        {key:"architect",label:"<span class='dtTitleText'>Architect of <br />Record (AOR)</span>", width:115, sortable:true, sortOptions:{sortFunction:sortArchitect}}
    ];

    var myDataSource = new YAHOO.util.DataSource(YAHOO.util.Dom.get("storableTable"));
    myDataSource.responseType = YAHOO.util.DataSource.TYPE_HTMLTABLE;
    myDataSource.responseSchema = {
        fields: [{key:"design", parser:"number"},
                {key:"status"},
                {key:"project"},
                {key:"address"},
                {key:"city"},
                {key:"state"},
                {key:"type"},
                {key:"feet", parser:"number"},
                {key:"owner"},
                {key:"architect"}
        ]
    };

    var myDataTable = new YAHOO.widget.DataTable("progEnhanceTable", myColumnDefs, myDataSource,
            {sortedBy:{key:"design",dir:"desc"}, renderLoopSize: 50}
    );

    return {
        oDS: myDataSource,
        oDT: myDataTable
    }; });

I am using a YUI DataTable with a custom sortFunction that strips out HTML code, to sort based on the text content only, rather than the entire string with HTML tags. The problem that I am having is that I need to make use of this sort function on three different columns, and I can not seem to pass the "field" value into my sort function. I want to use "field" rather than naming the column - because I would like to use the same sort function for all three columns rather than repeat it three times as I have in the code below. When I pass in "field" the sort stalls or hangs in the browser and "field" seems to be "undefined". Any ideas?

YAHOO.util.Event.addListener(window, "load", function() {

    var sortProject = function(a, b, desc) {
        var col = "project";
        // Deal with empty values 
            if(!YAHOO.lang.isValue(a)) {
                return (!YAHOO.lang.isValue(b)) ? 0 : 1;
            } 
            else if(!YAHOO.lang.isValue(b)) {
                return -1;
            }
        var comp = YAHOO.util.Sort.compare;
        var tagregex = /<[^>]*>/g;
        var aString = a.getData(col).replace(tagregex, "");
        var bString = b.getData(col).replace(tagregex, "");
        var compString = comp(aString, bString, desc);
        return compString;
    };

    var sortArchitect = function(a, b, desc) {
        var col = "architect"
        // Deal with empty values 
            if(!YAHOO.lang.isValue(a)) {
                return (!YAHOO.lang.isValue(b)) ? 0 : 1;
            }
            else if(!YAHOO.lang.isValue(b)) {
                return -1;
            }
        var comp = YAHOO.util.Sort.compare;
        var tagregex = /<[^>]*>/g;
        var aString = a.getData(col).replace(tagregex, "");
        var bString = b.getData(col).replace(tagregex, "");
        var compString = comp(aString, bString, desc);
        return compString;
    };

    var sortStatus = function(a, b, desc) {
        var col = "status"
        // Deal with empty values 
            if(!YAHOO.lang.isValue(a)) {
                return (!YAHOO.lang.isValue(b)) ? 0 : 1;
            }
            else if(!YAHOO.lang.isValue(b)) {
                return -1;
            }
        var comp = YAHOO.util.Sort.compare;
        var tagregex = /<[^>]*>/g;
        var aString = a.getData(col).replace(tagregex, "");
        var bString = b.getData(col).replace(tagregex, "");
        var compString = comp(aString, bString, desc);
        return compString;
    };

    var myColumnDefs = [
        {key:"design",label:"<span class='dtTitleText'>Design</span>", width:105, formatter:YAHOO.widget.DataTable.formatDate, sortable:true},
        {key:"status",label:"<span class='dtTitleText'>Status</span> <sup>1</sup>", sortable:true, width:62, sortOptions:{sortFunction:sortStatus}},
        {key:"project",label:"<span class='dtTitleText'>Project Name</span>", sortable:true, width:105, sortOptions:{sortFunction:sortProject}},
        {key:"address",label:"<span class='dtTitleTextNoSort'>Address</span>", width:80, sortable:false},
        {key:"city",label:"<span class='dtTitleText'>City</span>", width:80, sortable:true},
        {key:"state",label:"<span class='dtTitleText'>State</span>", width:45, sortable:true},
        {key:"type",label:"<span class='dtTitleText'>Building <br />Type</span>", width:75, sortable:true},
        {key:"feet",label:"<span class='dtTitleText'>Gross <br />Sq. Ft.</span>", width:55, formatter:YAHOO.widget.DataTable.formatNumber,sortable:true},
        {key:"owner",label:"<span class='dtTitleText'>Building <br />Owner</span>", width:95, sortable:true},
        {key:"architect",label:"<span class='dtTitleText'>Architect of <br />Record (AOR)</span>", width:115, sortable:true, sortOptions:{sortFunction:sortArchitect}}
    ];

    var myDataSource = new YAHOO.util.DataSource(YAHOO.util.Dom.get("storableTable"));
    myDataSource.responseType = YAHOO.util.DataSource.TYPE_HTMLTABLE;
    myDataSource.responseSchema = {
        fields: [{key:"design", parser:"number"},
                {key:"status"},
                {key:"project"},
                {key:"address"},
                {key:"city"},
                {key:"state"},
                {key:"type"},
                {key:"feet", parser:"number"},
                {key:"owner"},
                {key:"architect"}
        ]
    };

    var myDataTable = new YAHOO.widget.DataTable("progEnhanceTable", myColumnDefs, myDataSource,
            {sortedBy:{key:"design",dir:"desc"}, renderLoopSize: 50}
    );

    return {
        oDS: myDataSource,
        oDT: myDataTable
    }; });

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

野生奥特曼 2024-09-09 06:37:02

如何在函数中生成排序函数:

function makeSortFunction(col) {
    return function(a, b, desc) {

        // NOTE: the passed 'col' variable is available inside closure...

        // Deal with empty values 
            if(!YAHOO.lang.isValue(a)) {
                return (!YAHOO.lang.isValue(b)) ? 0 : 1;
            } 
            else if(!YAHOO.lang.isValue(b)) {
                return -1;
            }
        var comp = YAHOO.util.Sort.compare;
        var tagregex = /<[^>]*>/g;
        var aString = a.getData(col).replace(tagregex, "");
        var bString = b.getData(col).replace(tagregex, "");
        var compString = comp(aString, bString, desc);
        return compString;
    };
}

并将其用作

{key:"status",label:"<span class='dtTitleText'>Status</span> <sup>1</sup>", sortable:true, width:62, sortOptions:{sortFunction:makeSortFunction('status')}},
{key:"project",label:"<span class='dtTitleText'>Project Name</span>", sortable:true, width:105, sortOptions:{sortFunction:makeSortFunction('project')}},

不是引用函数,而是调用 makeSortFunction(),它返回实际的排序函数。

How about generating the sort functions in a function:

function makeSortFunction(col) {
    return function(a, b, desc) {

        // NOTE: the passed 'col' variable is available inside closure...

        // Deal with empty values 
            if(!YAHOO.lang.isValue(a)) {
                return (!YAHOO.lang.isValue(b)) ? 0 : 1;
            } 
            else if(!YAHOO.lang.isValue(b)) {
                return -1;
            }
        var comp = YAHOO.util.Sort.compare;
        var tagregex = /<[^>]*>/g;
        var aString = a.getData(col).replace(tagregex, "");
        var bString = b.getData(col).replace(tagregex, "");
        var compString = comp(aString, bString, desc);
        return compString;
    };
}

And use it as

{key:"status",label:"<span class='dtTitleText'>Status</span> <sup>1</sup>", sortable:true, width:62, sortOptions:{sortFunction:makeSortFunction('status')}},
{key:"project",label:"<span class='dtTitleText'>Project Name</span>", sortable:true, width:105, sortOptions:{sortFunction:makeSortFunction('project')}},

Rather than referring to the function, this is calling makeSortFunction(), which returns the actual sort function.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文