2013-07-22 3 views
8

Durandal은 shell이라는 기본보기를 가지고 있습니다.Durandal/녹아웃. 다른보기/viewmodel 업데이트

관리자/품질 보증 사용자가 모든 시스템 사용자를 모방 할 수 있도록 검색 상자를 추가했습니다. 버튼을 클릭하면 현재 표시되어있는보기의보기를 업데이트 할 수 있습니다.

  • 쉘 (블루) 보기 (적색)

난에서 호출 할 수 있도록 내 아이 뷰에 함수를 노출에 대해 어떻게 갈 것 셸 또는 자식보기에서 셸의 button click 이벤트에 후크합니다.

질문 :

Durandal 내가 거품에 사용하거나 다른보기 또는 부모 컨테이너에 이벤트를 전달할 수있는 후크를 노출합니까?

답변

11

자식보기가 여러 개이고 쉘과 하위 항목 간의 종속성을 원하지 않는다고 가정 할 때 Durandal의 이벤트 시스템을 사용하는 것이 가장 좋습니다. 셸보기가 게시자가되고 자식 뷰 구독자가됩니다.

데모를 보려면 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. –