gpt4 book ai didi

javascript - 具有隔离范围的指令与 AngularJS 中的 Controller 通信

转载 作者:行者123 更新时间:2023-11-30 10:19:36 25 4
gpt4 key购买 nike

我已经阅读了一些与我的问题类似的答案,例如 this one虽然无法将其转化为我自己的要求 - 来自缺乏理解......

我有一个 Controller :

appControllers.controller('TransactionsCtrl', ['$scope', 'InfiniteScrollingDataService', function ($scope, dataService) {
// setup our scope properties
$scope.$root.title = 'Transactions';
var urlQuery = {
skip: 0,
take: 25,
search: '',
order: 'DateTimeCreated',
orderBy: 'desc',
transactionTypeID: null,
transactionStatusID: null
};
var apiUrl = 'api/transactions';
$scope.transactions = new dataService(apiUrl, urlQuery);

$scope.Filter = function (senderParent, type, id) {
$scope.FilterApplied = true;
console.log('filter in controller: ' + senderParent + ' ' + type + ' ' + id);
}
}]);

我有一个指令:

appDirectives.directive('bootstrapListItems', ['$rootScope', function ($rootScope) {

return {
restrict: 'A',
templateUrl: 'bootstrapDropDownItems.html',
link: function (scope, element, attrs) {

scope.type = attrs.useGlobaljsonObject;
scope.parentElement = attrs.id;
scope.items = [];

var obj = $rootScope.globalJSON[scope.type];

for (o in obj) {
scope.items.push({ key: o, value: obj[o] })
}
}
}

}]);

还有我的指令模板:

<script type="text/ng-template" id="bootstrapDropDownItems.html">

<li class="active"><a href="#" class="lnkFilterList">- Any -</a></li>
<li ng-repeat="item in items">
<a href="#" class="lnkFilterList" ng-click="Filter(parentElement, type, item.key)">{{item.value}}</a>
</li>

</script>

如果我不隔离指令的范围,那么 Controller 会被正确调用,并且我会看到控制台注销我的参数。

但是,我(认为)我需要隔离作用域,因为页面上会有多个此指令。

当我将 scope:{} 添加到我的指令时,不再调用 Controller 函数。

我还尝试将我的 ng-click 更改为 ng-click="$parent.Filter(.....)" - 这似乎没有用要么。

谁能给我指出正确的方向?

最佳答案

ng-click="$parent.Filter(.....)" 不起作用,因为您将它放在 ng-repeat 中,这也会创建一个(非隔离的)范围。在那种情况下,你将不得不写

ng-click="$parent.$parent.Filter(.....)"

但不要那样做...

您可以在点击事件处理程序中发出一个事件并在您的 Controller 中监听它。

<script type="text/ng-template" id="bootstrapDropDownItems.html">

<li class="active"><a href="#" class="lnkFilterList">- Any -</a></li>
<li ng-repeat="item in items">
<a href="#" class="lnkFilterList" ng-click="onClick(parentElement, type, item.key)">{{item.value}}</a>
</li>

</script>

指令:

appDirectives.directive('bootstrapListItems', ['$rootScope', function ($rootScope) {

return {
restrict: 'A',
templateUrl: 'bootstrapDropDownItems.html',
link: function (scope, element, attrs) {

scope.type = attrs.useGlobaljsonObject;
scope.parentElement = attrs.id;
scope.items = [];

var obj = $rootScope.globalJSON[scope.type];

for (o in obj) {
scope.items.push({ key: o, value: obj[o] })
}
scope.onClick = function(){
// pass an array of original arguments to the event
scope.$emit('someEventName', Array.prototype.slice.call(arguments));
};
}
}

}]);

Controller :

appControllers.controller('TransactionsCtrl', ['$scope', 'InfiniteScrollingDataService', function ($scope, dataService) {
// setup our scope properties
$scope.$root.title = 'Transactions';
var urlQuery = {
skip: 0,
take: 25,
search: '',
order: 'DateTimeCreated',
orderBy: 'desc',
transactionTypeID: null,
transactionStatusID: null
};
var apiUrl = 'api/transactions';
$scope.transactions = new dataService(apiUrl, urlQuery);

$scope.$on('someEventName', function(e, args){
// call the $scope.Filter function with the passed array of arguments
$scope.Filter.apply(null, args);
});
$scope.Filter = function (senderParent, type, id) {
$scope.FilterApplied = true;
console.log('filter in controller: ' + senderParent + ' ' + type + ' ' + id);
}
}]);

关于javascript - 具有隔离范围的指令与 AngularJS 中的 Controller 通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21995008/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com