与facebox模态的knockoutjs

时间:2012-11-28 14:48:23

标签: jquery knockout.js facebox

我正在尝试使用knockoutjs模型创建一个网页,允许用户使用模态弹出窗口更新项目。对于模态我想使用jQuery facebox插件 - http://defunkt.io/facebox/

我有一个正在进行的工作演示,直到您第二次尝试更新项目时才有效。您更新的第一个项目保存正常,但随后绑定似乎丢失了。我试图调整其他问题的例子以适应facebox插件,但似乎无法做到正确。

我正在使用这样定义的自定义绑定处理程序: -

ko.bindingHandlers.modal = {
    init: function(element, valueAccessor, allBindingsAccessor) {
        var allBindings = allBindingsAccessor();
        var $element = $(element);
        $element.addClass('hide modal');

        if (allBindings.modalOptions) {
            if (allBindings.modalOptions.beforeClose) {
                $element.on('hide', function() {
                    return allBindings.modalOptions.beforeClose();
                });
            }
        }

        return ko.bindingHandlers['with'].init.apply(this, arguments);
    },
    update: function(element, valueAccessor) {
        var value = ko.utils.unwrapObservable(valueAccessor());

        var returnValue = ko.bindingHandlers['with'].update.apply(this, arguments);

        if (value) {
            $.facebox(element);
        } else {
            $(document).trigger('close.facebox');
        }

        return returnValue;
    }
};

在我的淘汰模型中,我有一个变量来存储我的模态编辑的所选项目,以及更新/保存/取消它的功能

self.editingMapmarker = ko.observable();
    self.editMapmarker = function(mapmarker) {
        self.editingMapmarker(mapmarker);
        self.editingMapmarker().reset();
    };

    self.saveMapmarker = function() {
        self.editingMapmarker().accept();
        self.editingMapmarker(undefined);
    }

    self.cancelSaveMapmarker = function() {
        self.editingMapmarker(undefined);
    }

到目前为止,我有一份Jsfiddle工作 - http://jsfiddle.net/juBxs/

第一次保存后,有人可以帮助我保持绑定吗?

1 个答案:

答案 0 :(得分:1)

两个选项:

您的自定义绑定看起来已经在KO 2.2中正常运行:http://jsfiddle.net/rniemeyer/Cpvtd/

如果您无法升级到2.2,那么您应该能够在更新功能中切换with更新和facebox打开/关闭的顺序。

update: function(element, valueAccessor) {
    var value = ko.utils.unwrapObservable(valueAccessor());

    if (value) {
        $.facebox(element);
    } else {
        $(document).trigger('close.facebox');
    }


    return ko.bindingHandlers['with'].update.apply(this, arguments);
}

此处示例:http://jsfiddle.net/rniemeyer/wsNZa/