on('更改:')事件在使用某些弹出窗口更改但在手动更改时不接受文本框值

时间:2015-07-29 17:46:16

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

继续我之前的question

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

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

当我们通过键盘手动添加时,更改事件会成功触发,文本框数据会添加到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);

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

1 个答案:

答案 0 :(得分:0)

我谦卑地承认我不能遵循上述逻辑。但是,我发现将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);