【问题标题】:knockout contentditable binding with array values用数组值淘汰 contentditable 绑定
【发布时间】:2017-12-10 08:20:47
【问题描述】:

我正在尝试创建自定义绑定,以在 this link 示例之后的表格上使用 HTML5 编辑内容,但我无法使用 observableArray()。

表格正在视图中显示,foreach data-bindig 如下所示:

        <tbody data-bind="foreach: customers">
            <tr data-bind="attr: {id: $index}">
                <td style="text-align: center;">
                    <span class="label label-primary" data-bind="html: Id"></span>
                </td>
                <td data-bind="html: Name, attr: {id: 'Nome'}, contentEditable: true"></td>
            </tr>
        </tbody>

视图模型是这样的:

函数 ViewModel() {

        var self = this;

        self.data = '@jsonList';
        self.customers = ko.observableArray(JSON.parse(self.data));
        self.editable = ko.observable(false);

        for (i = 0; i < self.customers().length; i++) {

            self.customers()[i]['Details'] = '/Anagrafica/Details/' + self.customers()[i]['Id'];

            self.customers()[i]['Delete'] = '/Anagrafica/Delete/' + self.customers()[i]['Id'];

        };

        ko.bindingHandlers.htmlEdit= {

            update: function (element, valueAccessor) {
                var value = ko.unwrap(valueAccessor());
            }
        };

        ko.bindingHandlers.contentEditable = {

            init: function (element, valueAccessor, allBindingsAccessor) {
                var value = ko.unwrap(valueAccessor()),
                    htmlEdit= allBindingsAccessor().htmlEdit;

                $(element).on("input", function () {
                    if (ko.isWriteableObservable(htmlEdit)) {
                        htmlEdit(this.innerHTML);
                    }
                });
            },

            update: function (element, valueAccessor) {
                var value = ko.unwrap(valueAccessor());
                element.contentEditable = value;
                $(element).trigger("input");
            }

        };
    };


    var viewModel = new ViewModel();

    ko.applyBindings(viewModel);

目前我对代码本身感到困惑,因为我不明白如何将其设置为指向数组上的元素。

注意:数组已填充,显示内容没有问题。

编辑:在这里我添加了 JSFiddle https://jsfiddle.net/wxn34p45/ 以便更好地阅读代码

【问题讨论】:

    标签: javascript arrays knockout.js


    【解决方案1】:

    您的姓名似乎是拼写错误,而不是姓名:

    <td data-bind="html: name, attr: {id: 'Nome'}, contentEditable: true"></td> 
    

    customers 也不是 observableArray(至少在你的小提琴中):

    self.customers = ko.observableArray([{"Id":1111,"name":" [Malena]"},{"Id":2222,"name":" [Maria]"},{"Id":3333,"name":" [Merio]"},{"Id":4444,"name":" [Milena]"}]);
    

    我已经更新了小提琴(也让它通过淘汰赛运行,并且我已经显示了 ViewModel 的副本以帮助调试),内容现在可以编辑了。

    <h4>View Model</h4>
      <pre data-bind="text: ko.toJSON($data, null, 2)"></pre>
    

    这现在是否产生了预期的效果?

    https://jsfiddle.net/asindlemouat/wxn34p45/1/

    编辑

    根据提供的进一步信息,我已设法使其可编辑,我已从客户数组中删除可编辑并使用 ViewModel 中的那个。

    当它循环遍历客户数组时,您需要使用 $parent.editable 在 ViewModel 中调用可编辑的 observable。

    <tbody data-bind="foreach: customers">
      <tr data-bind="attr: {id: $index}">
        <td style="text-align: center;">
          <span class="label label-primary" data-bind="html: Id"></span>
        </td>
        <td data-bind="html: name, attr: {id: 'Nome'}, contentEditable: $parent.editable"></td>
        <td></td>
      </tr>
    </tbody>
    

    更新小提琴:https://jsfiddle.net/asindlemouat/wxn34p45/8/

    【讨论】:

    • 感谢您的关注和对我的 Fiddle 的编辑(我在使用它时很糟糕),但不:它仍然没有得到修改。最终目的是使用它通过 Ajax 调用来更改原始模型 ^^" 但我已经知道如何进行调用
    • 我的意思是,内容应该可以用 "contentEditable: editable" 进行编辑,这样自定义处理程序就会改变 observable 数组中的参数
    • 好的,是什么触发了可编辑和不可编辑之间的变化?您提供给其他 SO 帖子的链接中接受的答案中的示例他们正在使用复选框来更改 self.editable 的值。
    • 有一个按钮不是我写的,抱歉:即使现在修改它,使用复选框并将“可编辑”添加到虚拟机“客户”,但现在可编辑不起作用大声笑跨度>
    • 你有更新小提琴的链接,然后我可能会看到什么问题?
    猜你喜欢
    • 1970-01-01
    • 2014-08-20
    • 1970-01-01
    • 1970-01-01
    • 2013-02-04
    • 2013-03-08
    • 1970-01-01
    • 2013-12-30
    • 2013-10-31
    相关资源
    最近更新 更多