knockout js多视图模型绑定

时间:2014-03-17 08:46:16

标签: javascript jquery knockout.js

多视图模型绑定应用程序应用here一个jsfiddle应用程序。

    ko.bindingHandlers.stopBinding = {
        init: function() {
             return { controlsDescendantBindings: true };
        }        
    };

    var shellModel = {
        selectedSection: ko.observable(),
    };

主视图与子视图分开。当您点击"个人资料" 按钮时,个人资料子视图模型将作为 selectedview 激活。我想在子模型中放置一个关闭按钮,当我单击它时,主selectedview对象将为null。

1 个答案:

答案 0 :(得分:1)

解决这个问题的两种方法

耦合Shell和子视图

对每个子视图添加一个close函数以回调shellModel

var profileModel = {
    first: ko.observable("Bob"),
    last: ko.observable("Smith"),
    onClose: function() {
        shellModel.selectedSection(null);
    }
};

然后为每个子视图div添加一些关闭按钮

<button data-bind="click: onClose">Close</button>

使用消息传递解析

使用子/ pub消息库(如AmplifyPubSubJS)。我在下面使用了放大。

使用sub / pub方法可以创建publishMsg绑定

// Very simplistic handler.
ko.bindingHandlers.publishMsg = {
    init: function(element, valueAccessor, allBindings, viewModel, bindingContext ) {
        var msgToPublish = valueAccessor();
        ko.bindingHandlers["click"].init(element, function() {
            return function() {
                amplify.publish(msgToPublish);
            }
        }, allBindings, viewModel, bindingContext);
    }        
};

为每个子视图div添加一个按钮,或在父div中添加1

<button data-bind="publishMsg: 'subview-close'">Close</button>

添加订阅以清除selectedSection。

// Callback for subscription
amplify.subscribe('subview-close', function() {
    shellModel.selectedSection(null);
}

您还可以添加onClose函数(如在耦合解决方案中),但只需调用publish ...

var profileModel = {
    ...
    onClose: function() {
        amplify.publish('subview-close');
    }
};    

但这会污染对象模型恕我直言(但完成工作)