【问题标题】:on('change:') event not accepting textbox value when changed using some popup but when changed manuallyon('change:') 事件在使用某些弹出窗口进行更改但手动更改时不接受文本框值
【发布时间】:2015-07-29 17:46:15
【问题描述】:

继续我之前的question

我正在使用dobcto formbuilder 插件。此插件使用rivets.jsbackbone.js

在我之前的问题中,我无法弄清楚出了什么问题,但是在12 hours 对该插件代码进行了研究之后。我发现问题在于使用一些弹出窗口将数据添加到textbox

当我们通过键盘手动添加时,change事件触发成功,文本框数据被添加到JSON结果中。

我浏览了 rivets.js 文档并阅读了有关它的所有内容。但是这个插件使用的是旧版本的 rivets.js,我现在不想更新它,因为项目提交日期快到了,我还有很多工作要做。

所以如果能在这个版本中解决那就太好了。该插件像这样初始化 rivets.js:

(function () {
    rivets.binders.input = {
        publishes: true,
        routine: rivets.binders.value.routine,
        bind: function (el) {
            return $(el).bind('input.rivets', this.publish);
        },
        unbind: function (el) {
            return $(el).unbind('input.rivets');
        }
    };

    rivets.configure({
        prefix: "rv",
        adapter: {
            subscribe: function (obj, keypath, callback) {
                callback.wrapped = function (m, v) {
                    return callback(v);
                };
                return obj.on('change:' + keypath, callback.wrapped);
            },
            unsubscribe: function (obj, keypath, callback) {
                return obj.off('change:' + keypath, callback.wrapped);
            },
            read: function (obj, keypath) {
                if (keypath === "cid") {
                    return obj.cid;
                }
                return obj.get(keypath);
            },
            publish: function (obj, keypath, value) {
                if (obj.cid) {
                    return obj.set(keypath, value);
                } else {
                    return obj[keypath] = value;
                }
            }
        }
    });

}).call(this);

即使在阅读了铆钉文档之后,我也无法理解这段代码。那么请告诉我如何更改这个初始化过程,以便它接受弹出窗口添加的文本框文本?

【问题讨论】:

    标签: javascript jquery html backbone.js rivets.js


    【解决方案1】:

    我谦虚地承认我无法遵循上述逻辑。但是,我发现将propertychangeinput 绑定到事件会产生比change 更好的结果。

    (function () {
        rivets.binders.input = {
            publishes: true,
            routine: rivets.binders.value.routine,
            bind: function (el) {
                return $(el).bind('input.rivets', this.publish);
            },
            unbind: function (el) {
                return $(el).unbind('input.rivets');
            }
        };
    
        rivets.configure({
            prefix: "rv",
            adapter: {
                subscribe: function (obj, keypath, callback) {
                    callback.wrapped = function (m, v) {
                        return callback(v);
                    };
                    return obj.on('change:' + keypath, callback.wrapped);
                },
            this.on('propertychange input', function (changeSwap) { unsubscribe: function(obj, keypath, callback) { return obj.off('change:' + keypath, callback.wrapped); }, });,
                read: function (obj, keypath) {
                    if (keypath === "cid") {
                        return obj.cid;
                    }
                    return obj.get(keypath);
                },
                publish: function (obj, keypath, value) {
                    if (obj.cid) {
                        return obj.set(keypath, value);
                    } else {
                        return obj[keypath] = value;
                    }
                }
            }
        });
    
    }).call(this);
    

    【讨论】:

    • 问题是插件高度依赖这段代码。在这里查看:github.com/dobtco/formbuilder/blob/gh-pages/dist/formbuilder.js.
    • 由于它只出现在 4 个地方(使用搜索),是否可以将这 4 行包装在更用户友好的触发事件中?例如,采取以下行return obj.off('change:' + keypath, callback.wrapped); ....到这样的事情.....this.on('propertychange input', function (changeSwap) { unsubscribe: function(obj, keypath, callback) { return obj.off('change:' + keypath, callback.wrapped); }, }); 我想,目标是在不影响任何内置工作代码的情况下添加额外的功能。 @AishwaryaShiva
    • 我应该在哪里添加此代码?你能编辑我的代码并告诉我吗?
    • 答案已更新。我更改的行是 unsubscribe: 如果它不起作用,您可能必须保持原样,并在另一个变量中完全调用 ENTIRE 函数(如果可能的话)。
    • 你不觉得这会导致在选项定义之间添加语法错误吗?
    猜你喜欢
    • 1970-01-01
    • 2021-02-23
    • 2016-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-07
    相关资源
    最近更新 更多