在knockout.js中重用ViewModel之间的数据

时间:2012-11-20 17:28:00

标签: javascript knockout.js knockout-2.0 breeze

我在一个淘汰赛ViewModel中有一个由AJAX调用填充的数组,它会显示网页上每个项目的几个数据字段。

现在我需要让用户点击一个项目,其中填充了从前一个AJAX请求收到的数据的侧栏(一些字段加上更多)。

我认为通常会选择 id 并执行 item 特定的AJAX请求,通过Sammy.js进行路由,但我们不需要。

我是淘汰赛的新手;我想要的最好的策略是让各个div显示一个ViewModel来显示数据,但是如何让ViewModel在它们之间传递数据呢?这是禁忌吗?

  • 通过窗口对象引用其他窗口?
  • 使用 with:关键字?它不断出现,但在这种情况下我无法看到如何应用它。
  • 也许是通过Sammy.js,并在放大中缓存数据?

这是深入分析功能的一个示例,我已经阅读了大量有关此问题的StackOverflow Q& A但找不到我可以使用的东西。我已经按照John Papa的PluralSight教程进入了这个阶段。

4 个答案:

答案 0 :(得分:6)

您可能想要使用Amplify的消息传递或@RPNiemeyer上面提到的库来使用pub / sub模型。两者都很棒。

然而,听起来您只是想从服务器获取数据,然后在多个视图模型中使用该数据。甚至可能在多个视图模型中共享一些数据。我的SPA教程中的datacontext概念允许您在datacontext中托管数据并从其他视图模型中引用它。

您还可以使用像Breeze这样的库来帮助实现这一目标(Breeze会替换我的SPA中的datacontext ......并且会更好,因为我将在即将开始的课程中展示。)

这些只是几个选项

答案 1 :(得分:1)

您可能还想查看breeze文档中“Cool Breezes”下的“Share an EntityManager”帖子。

共享单个EntityManager可能就是您所需要的。但如果您认为自己需要多个,请阅读“Multiple managers”。

答案 2 :(得分:0)

正如评论中所提到的,最好的选择是使用knockout-postbox

  

knockout-postbox是一个Knockout.js插件,旨在使用Knockout的基本发布/订阅功能来促进单独视图模型/组件之间的分离通信。

这允许您设置简单的基于主题的通信,如:

var ViewModelOne = function() {
  this.isEditable = ko.observable();  
};

var ViewModelTwo = function() {
  this.editable = ko.observable(false);  
};

var one = new ViewModelOne();
var two = new ViewModelTwo();

var editableTopic = "myEditableTopic";
one.isEditable.subscribeTo(editableTopic);
two.editable.publishOn(editableTopic)

答案 3 :(得分:0)

IMO最简单的方法是简单地将带有可观察数据的“params”传递给侧边栏组件。 http://knockoutjs.com/documentation/component-custom-elements.html#passing-observable-expressions