多个敲除绑定并共享它们

时间:2013-01-30 14:25:19

标签: asp.net-mvc-3 knockout.js sammy.js

所以我有一个场景,我的主页上有敲门声。

Index.cshtml:

<div data-bind="foreach breadcrumbs">
<div>

<script>
 var IndexViewModel = function () {
    var self = this;
    self.breadcrumbs = ko.observableArray();
 };
 ko.applyBindings(IndexViewModel);
</script>

在Index.cshtml中加载的部分视图。部分视图有自己的敲除绑定:

<div id="someId">

</div>
<script>
  var PartialViewModel = function () {
        var self = this;
        self.someFunction = function(){
            // Access Breadcrumbs here
        };
  };
  ko.applyBindings(PartialViewModel, "someId");
</script>

我想从第二个局部视图访问面包屑observableArray并向它们添加项目。我甚至不确定这是否可能。请帮忙。我也在使用sammy.js,但为了这个目的,它并不相关。

2 个答案:

答案 0 :(得分:2)

我不喜欢在视图模型之间存在依赖关系,因此我之前使用了jQuery pubsub插件来允许视图模型以解耦的方式相互通信。您可以在this answer

中查看相关示例

基本上,当您更新痕迹导航时,请使用新阵列调用publish,而另一个视图模型将订阅该事件。

答案 1 :(得分:0)

一个简单的解决方案(但不是很干净)将indexViewModel存储在全局变量中。

Index.cshtml:

 var IndexViewModel = function () {
    var self = this;
    self.breadcrumbs = ko.observableArray();
 };
 // we create a global variable here
 window.indexViewModel = new IndexViewModel();

 ko.applyBindings(window.indexViewModel);

然后您可以从部分视图模型访问此indexViewModel:

  var PartialViewModel = function () {
        var self = this;
        self.someFunction = function(){
            // Access Breadcrumbs here
            // better use some wrapping functions 
            // instead of accessing the array directly
            window.indexViewModel.breadcrumbs.push({}); 
        };
  };
  ko.applyBindings(new PartialViewModel(), "someId");
</script>