Durandal 撰写绑定视图模型变量的更改值

Durandal compose change value of a variable of bound viewmodel

在我的应用程序中,我在名为 'home.html' 的视图中有一个名为 'notifications' 的部分。现在我需要在另一个视图中使用此部分,所以我复制了 'notifications.html' 中的所有通知标记,我正在通过组合使用这些标记。

问题是我不想将我用于通知的所有代码从 'home.js' 复制到将使用通知的新视图的另一个视图模型。因此,我不想在视图 viewmodel 中有一个 observableArray 的通知,而是想要一个仅用于 'notification.html' 的包含此数据的模块。但是我不知道如何从我的其他视图模型中更改 'notification.js' 内的 observableArray 的值。

这是我目前所做的:

notification.js

define(['knockout'], function(ko) {

var notifications = ko.observableArray([]),
setNotifications = function(data) {
    notifications(data)
}

return {
  notifications: notifications,
  setNotifications: setNotifications
}

home.js

define(['knockout', 'notification'], function(ko, notification) {
  var self = this
  ...
  self.activate = function() {
    http.get('...').then(function(data) {
    notification.setNotification(data)
  })
}

home.html

<div data-bind="compose: 'viewmodels/notifications'"></div>

我所知道的是,当在组合绑定中使用视图模型路径时,该视图模型的标记被注入并绑定到它的模块视图模型。

问题:我想从主视图 'home.js' 的视图模型中更改 'notification.js' 中 'notifications' 数组的值。我知道我目前的尝试是行不通的,因为我相信注入 notifications.htmlnotifications.js viewmodel 实例与我在 home.js 中需要的实例不同。那么我该如何实现呢?

我可以在 compose 绑定上使用 model 属性 来解决这个问题。

标记:

<div data-bind="compose: { view: 'views/notifications', model: $root.notificationModel }"></div>

notification.js 具有相同的代码 - returns 视图模型 ("return vm")

并且在 home.js 文件中:

define(['knockout', 'plugins/http', 'notification'], function(ko, http, NotificationModel) {
 var self = this
 self.notificationModel;
 ...
 self.activate = function() {
  return http.get('').then(function(data) {
   self.notificationModel = new NotificationModel()
   self.notificationModel.setNotifications(data)
   })
 }

})