13

我正在使用 HandsOnTable 使编辑数据库表在我的网站上更具交互性。

HandsOnTable 几乎满足了我的所有要求,除了我的数据库中的某些列实际上存储的是外键而不是本地字符串值。

在 UI 中,我希望这些列显示为下拉菜单,用户可以在其中选择映射到前面提到的外键的可读值(即类似于 HTML 名称/值select)。

不幸的是 HandsOnTable 没有这样的单元格类型。最接近它的是autocomplete. 这允许我创建一个下拉列表,但它只包含值;没有对应的键。以下是它的创建方式:

"source": ["Jebediah", "Bob", "Bill", "Buzz"]

所以我打算从服务器发送两个 Json 字符串:

一个包含 HandsOnTable 渲染表格所需的参数:

{
    "data": [
        { "ID": 1, "Description": "Crude", "Volume": 204, "Customer": "jebediah" },
        { "ID": 2, "Description": "Hidrogen", "Volume": 513, "Customer": "Bob" },
        { "ID": 3, "Description": "Coal", "Volume": '67', "Customer": "Bill" },
        { "ID": 4, "Description": "Wood", "Volume": '513',  "Customer": "Buzz" }
    ],
    "columns": [
        { "data": "ID", "type": "numeric" },
        { "data": "Description", "type": "text"},
        { "data: "Volume", "type": "numeric" },
        { "data": "color", "type": "autocomplete", "strict": "true",
            "source": ["Jebediah", "Bob", "Bill", "Buzz"]}
    ]
}

第二个映射键到值

{
    "mappings": [
        {"key": 0, "value": "Jebediah"}, 
        {"key": 0, "value": "Bob"},
        {"key": 0, "value": "Bill"}, 
        {"key": 0, "value": "Buzz"}
    ]
}

到目前为止,一切都很好。现在是棘手的部分:

HandsOnTable 有一个函数 ( getData()),它允许我检索表数据作为准备发送回服务器的 Json 字符串:

var jdata = myHandsOnTable.getData();

jdata 看起来像这样:

"data": [
    { "ID": 1, "Description": "Crude", "Volume": 204, "Customer": "jebediah" },
    { "ID": 2, "Description": "Hidrogen", "Volume": 513, "Customer": "Bob" },
    { "ID": 3, "Description": "Coal", "Volume": '67', "Customer": "Bill" },
    { "ID": 4, "Description": "Wood", "Volume": '513',  "Customer": "Buzz" }
]

现在在发布之前,我想用json 字符串Customer中的匹配对键替换节点的值。mappings

我怎样才能最好地在 JavaScript/JQuery 中实现这一点?

是否有一个功能如下?:

jdata.replaceNode('node', mappings)

谢谢

4

1 回答 1

8

我有一个类似的问题,这就是我所做的......

对于每个外键列,我在 handsontable 中存储了 2 个值;一个用于 id 本身,我将其设置为隐藏列,另一个是用户友好的可读文本值作为下拉列表。

每次更改下拉列表的值时,我也会更改相应的隐藏ID。在我的情况下,我在handsontable 之外有一个下拉列表作为过滤器,用于映射键/值对,但您可以使用哈希表或其他任何东西。

现在代码...

Handsontable 配置

afterChange: function (changes, source) { AfterChange(changes, source); }

更改事件之后(每次表中有更改时调用):

function AfterChange(Changes, Source) {

    if (Source === 'loadData') {
        return; //don't save this change
    }
    var rowIndex = 0, columnID = 1, oldTextVal = 2, newTextVal = 3, ntv = '', nv = '';
    $(Changes).each(function () {
        if (this[columnID] === 'CategoryID') {
            // Do nothing...
            //To make sure nothing else happens when this column is set through below
        }
        else if (this[columnID] === 'CategoryName') {
            ntv = this[newTextVal];
            //This is where I do my mapping using a dropdown.
            nv = $('#CategoriesFilterDropdown option').filter(function () { return $(this).text() === ntv; }).val();
            //13 is my CategoryID column
            $container.handsontable('setDataAtCell', this[rowIndex], 13, nv);
        }
    });
    }
}

这样,您就可以像自己一样更改外键,而无需在保存之前全部循环。它还可以轻松地将表数据按原样发送回服务器。

总之,_

  • 用户与CategoryName列(类型为autocomplete)进行交互。
  • 通过使用handsontable 选项CatgoryID将列宽设置为 0,该列对用户隐藏。colWidths
  • CategoryName字段发生变化时,使用afterChangeevent 设置对应的CategoryID列。就我而言,我在页面的其他位置使用下拉菜单来映射 Name => ID,但您可以使用其他方式,例如哈希表。

我希望这是有道理的...

于 2013-07-25T07:42:25.897 回答