2013-07-22 27 views
8

Durandal有一個名爲shell的基本視圖。杜蘭達爾/淘汰賽。更新其他視圖/ viewmodel

我在其上添加了一個搜索框,以允許管理員/質量保證用戶模仿任何系統用戶。 在按鈕上單擊我希望能夠更新當前顯示的任何視圖的視圖。

  • 殼牌(藍色) 視圖(紅色)

我怎麼會去,我的子視圖露出函數,這樣我可以把它shell或掛鉤到子視圖中的shell按鈕單擊事件。

問:

是否迪朗達爾暴露任何掛鉤,我可以利用氣泡或通過事件不同的意見或父容器?

回答

11

假設你有多個子視圖,並且不想引入shell和子項之間的依賴關係,最好使用Durandal的事件系統。 shell視圖將成爲發佈者和子視圖訂閱者。

查看http://dfiddle.github.io/dFiddle-1.2/#/event-aggregator/dFiddle進行工作演示。

publisher.js

define(['durandal/app'], function (app) { 

    var message = ko.observable(); 
    var canPublish = ko.computed(function() { 
     return message() ? true : false; 
    }); 

    return { 
     message: message, 
     canPublish:canPublish, 
     publish: function() { 
      app.trigger('sample:event', message()); 
     } 
    }; 
}); 

subscriber.js

define(['durandal/app'], function (app) { 

    return { 
     received: ko.observableArray([]), 
     subscription:ko.observable(), 
     subscribe: function() { 
      var sub = app.on('sample:event').then(function(message) { 
       this.received.push(message); 
      }, this); 

      this.subscription(sub); 
     }, 
     unsubscribe: function() { 
      this.subscription().off(); 
      this.subscription(null); 
     } 
    }; 
}); 

可以考慮其它選項

  • 共享模塊返回一個單帶性質應該父母/孩子之間共享。缺點是需要將其定義爲所有父/子的依賴關係。
  • 一個全局的例如myApp的屬性...缺點:暴露全球
+1

這是一個該死的很酷的解決方案。 :)感謝所有的幫助再次Rainer。 –