我试图创建一个指令,允许我传入一个属性字符串,然后在订阅事件时将其用作“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