Durandal组合绑定视图模型

时间:2015-07-02 04:12:26

标签: javascript knockout.js durandal durandal-2.0

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

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

这是我到目前为止所做的:

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>

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

问题:我想从我的主视图'notification.js'的viewmodel更改'home.js'内的'notifications'数组的值。我知道我当前的试验性不会起作用,因为我认为注入notifications.js的{​​{1}} viewmodel实例与我在notifications.html内所需的实例不同。那我怎么能实现呢?

1 个答案:

答案 0 :(得分:0)

我可以使用model绑定上的compose属性解决此问题。

标记:

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

notification.js具有相同的代码 - 它返回viewmodel(&#34; return vm&#34;)

在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)
   })
 }

})