我試圖創建一個指令,允許我傳入一個屬性字符串,然後在訂閱事件時將其用作「name」參數使用$ scope。$ on。本質上,這一系列事件是這樣的:
- 一個對象被廣播使用$ rootScope。$ broadcast在另一個控制器中調用'validationResultMessage'。
- 我有一個指令,其中有一個屬性叫「訂閱」,我傳遞字符串'validationResultMessage'。
- 該指令將「subscription」屬性的值傳遞給其作用域,並使用「$ scope。$ on」對其進行訂閱。
問題是,它看起來像屬性的值是「未定義」的時候,所有的評估,所以當我嘗試使用$ scope。$ on進行訂閱時,它實際上訂閱我「undefined 「而不是 」validationResultMessage「
這裏是我的指令:
app.directive('detailPane', function() {
return {
restrict: 'E',
scope: {
selectedItem: '=',
subscription: '@',
},
templateUrl: 'app/templates/DetailPane.html', //I'm also worried that this is causing my controller to get instantiated twice
controller: 'DetailPaneController'
};
});
然後我用這樣的:
<td class="sidebar" ng-controller="DetailPaneController" ng-style="{ 'display': sidebarDisplay }">
<detail-pane
selected-item='validationResult'
subscription='validationResultMessage'/>
</td>
而那我想這個屬性傳遞到控制器:
app.controller('DetailPaneController', ['$scope', '$http', 'dataService', 'toastr', '$uibModal', '$rootScope', '$attrs', function ($scope, $http, dataService, toastr, $uibModal, $rootScope, $attrs) {
$scope.fetching = [];
$scope.validationResult = null;
$scope.sidebarDisplay = 'block';
console.log('subscription is ', $scope.subscription);
var thisSubscription = $scope.subscription;
//if I hardcode the param as 'validationResultMessage', this works
$scope.$on($scope.subscription, function (event, arg) {
$scope.validationResult = arg;
});
}]);
從表面上看,這確實提供了我之後的行爲。如果我的理解正確,它將父節點DetailPaneController的作用域的validationResult設置爲SecondController正在廣播的內容。我想我可以使用模板引用validationResult1和validationResult2來顯示我想要的信息,如果我不想插入內聯。 我看到你正在使用鏈接功能來完成這種行爲,這不是我以前考慮過的事情。我是否正確理解此解決方案的基本機制? – istrupin
是的,'$ broadcast'給'$ root'並讓任何訂閱的偵聽器獲得事件。在這個要求中,我們通過指令來做到這一點,每一個細節帕恩只應該聽取它訂閱的內容。需要可重複使用和獨立。 'selected-item'是當收到消息時需要更新的'model',可能綁定到聲明的控制器/視圖。對於這種類型的DOM操作以及需要指令邏輯的'link'是強大的。我已經使用'validationresult1'和2來模擬你的設置並顯示可以傳遞細節。不是必需的。@ istrupin – Searching