0
我有2個指令創建一個網格表。 對於每一行我們可能有一些操作,我的問題是我可以以某種方式訪問這些操作,而無需調用$ parent。$ parent.action在我的模板中?子指令不能訪問父控制器
.directive("grid", function ($compile, $parse) {
return {
restrict: 'AE',
scope: {
templateUrl : '@?',
columns : '=',
filterBy : '=?',
excludeSortColumns : '=?'
},
controller: GridController,
controllerAs: 'grid',
bindToController: true,
replace: true,
transclude: true,
templateUrl: function($element, $attrs) {
if(!angular.isDefined($attrs.filterBy)) {
return '/assets/js/src/templates/partials/grid/grid-sortable.tpl.html';
}
return $attrs.templateUrl || '/assets/js/src/templates/partials/grid/grid.tpl.html';
},
link: function($scope, $element, $attrs, ctrl, transclude) {
//filter collection when user has typed some letter
$element.on('keyup', function() {
$scope.$apply(function() {
$scope.$parent.filterValue = $('.filterBy').val();
});
});
//var e = $compile(transclude())($scope.$parent);
//angular.element('.table').append(e);
$element.append(transclude($scope.$parent));
}
};
function GridController($scope, $element, $attrs) {
var vm = this;
vm.columns = $parse($attrs.columns)($scope.$parent);
vm.excludeSortColumns = angular.isDefined($attrs.excludeSortColumns) ? $parse($attrs.excludeSortColumns)($scope.$parent) : false;
vm.filterCol = angular.isDefined($attrs.filterBy) ? $parse($attrs.filterBy)($scope.$parent) : false;
vm.sortBy = function(column) {
if(!vm.isExludedSortBy(column)) {
vm.predicate = column;
vm.reverse = (vm.predicate === column) ? !vm.reverse : false;
var sortType = (vm.reverse) ? '-' : '+';
$scope.$parent.orderByColumn = sortType + column;
}
};
vm.isExludedSortBy = function(column) {
if(!vm.excludeSortColumns) {
return true;
}
if(vm.excludeSortColumns.indexOf(column) >= 0) {
return true;
}
return false;
};
};
})
.directive("gridBody", function ($parse) {
return {
restrict: 'AE',
scope: {
templateUrl : '@?',
collection : '='
},
require: '^grid',
controller: function($scope, $element, $attrs) {
var vm = this;
vm.collection = $parse($attrs.collection)($scope.$parent);
},
controllerAs: 'body',
bindToController: true,
replace: true,
transclude: false,
templateUrl: function($element, $attrs) {
return $attrs.templateUrl || '/assets/js/src/templates/partials/grid/grid-body.tpl.html';
}
};
})
這是一個模板:
<tbody>
<tr ng-repeat="item in body.collection | gridFilterBy:$parent.filterBy:$parent.filterValue | orderBy:$parent.orderByColumn track by $index">
<td class="col-sm-1">{{item.id}}</td>
<td class="col-sm-2">{{item.name}}</td>
<td class="col-sm-1">{{item.latest_result.count}}</td>
<td class="col-sm-2">{{item.created_at}}</td>
<td class="col-sm-2">{{item.updated_at}}</td>
<td class="col-sm-4">
<button class="btn btn-primary" ng-disabled="item.has_cluster" role="button" ng-click="$parent.$parent.addCluster(item.id)">
Crea cluster
</button>
<button class="btn btn-primary" role="button" ng-click="$parent.getExports(item.id, item.name)">
Export
</button>
<button class="btn btn-primary" role="button" ng-click="$parent.$parent.loadQuery(item.id)">
Visualizza
</button>
<button class="btn btn-primary" role="button" ng-click="$parent.$parent.removeQuery(item.id)">
Rimuovi
</button>
</td>
</tr>
</tbody>
<grid columns="columns" filter-by="filterBy" exclude-sort-columns="excludeColumns">
<grid-body collection="result.items" template-url="/assets/js/src/templates/partials/grid/grid-body.tpl.html"></grid-body>
</grid>
我不能讓網格控制器
感謝所有的答覆。
好吧,我知道我可以使用require屬性來檢索父控制器,但是當我將它設置在我的子指令上時,它會引發此錯誤:找不到指令'gridBody'所需的'Controller'網格! –