Angular '&' 绑定和参数
Angular '&' Binding and parameters
我正在尝试编写一个名为 "foo" 的组件 - 这个组件带有一个标签,并显示 "hello {{$ctrl.label}}"。它还会在点击
时调用回调函数
<foo label="'bar'" callback="$ctrl.myCallback()"</foo>
到目前为止一切都很好。我的控制器确实得到了回调
所以现在我把这个元素放到一个 ng-repeat 中:
<foo ng-repeat="item in $ctrl.items" label="item.label" callback="$ctrl.myCallback(item)></foo>
我如何在组件中定义点击后传回控制器的内容?该组件没有 item
传递给它,只有 "label"。
根据我读到的内容,我需要说些类似的话
this.callback({item: SomeObject});
我这里有 2 个问题:1) 组件 如何知道 它需要提供 "item" 键和 2) 组件如何知道 SomeObject是?
我可以轻松地在另一个 ng-repeat 中重用该组件:
<foo ng-repeat="order in $ctrl.orders" label="order.orderNum" callback="$ctrl.myCallback(order)></foo>
在这种情况下,组件如何知道将订单对象作为参数发送给点击回调函数?
组件不太了解它,你知道,你的单元测试知道,你的端到端测试知道(可能),但组件只知道它有一个回调(带有命名参数)和一个 属性 和它们的 way-binding
,这就是进行绑定所需要的。此外,您不必从组件端传递任何内容,除非您从组件发送 item 对象,否则,只需使用一个简单的 $ctr.callback()
绑定将调用 $parent.myControllerFunction(item)
来自ng-repeat
范围。
使用 &
时,您可以创建一个委托方法,根据您在模板上创建的掩码从组件调用。例如:
<ANY ng-repeat="item in items" callback="myCallBack(item)">
...
bindings: {
callback: '&'
}
...
如果您从组件中像 $ctrl.callback()
那样调用它,它将使用 ng-repeat
范围内的项目。但是如果你想从组件发送它,那么你必须传递一个对象,其中包含你在模板上使用的参数名称,比如 $ctrl.callback({ item: { name: 'foo'}})
来填充在 callback="myCallBack(item)"
上声明的参数。
angular
.module('mBoard', [])
.component('widget', {
bindings: {
item: '=',
callback: '&'
},
controller: function() {
var $ctrl = this;
$ctrl.save = function() {
//$ctrl.callback();
$ctrl.callback({ item: { name : $ctrl.item.name + '%%%%' }});
}
},
templateUrl: 'template.html'
})
.controller('mBoardCtrl', function mBoardCtrl($interval, $scope) {
$scope.items = [{name: 'uno'}, {name: 'dos'}, {name: 'tres'}];
$scope.setItem = function(item) {
console.log(item)
}
});
/* https://docs.angularjs.org/guide/bootstrap */
angular.bootstrap(document, ['mBoard']);
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.8/angular.js"></script>
<div ng-controller="mBoardCtrl ">
<widget ng-repeat="item in items" item="item" callback="setItem(item)"></widget>
<hr>
<widget ng-repeat="item in items" item="item" callback="setItem('quatorze')"></widget>
<!-- https://docs.angularjs.org/api/ng/service/$templateCache -->
<script type="text/ng-template" id="template.html">
<button type="button" ng-click="$ctrl.save()">{{ $ctrl.item.name }}</button>
</script>
</div>
我正在尝试编写一个名为 "foo" 的组件 - 这个组件带有一个标签,并显示 "hello {{$ctrl.label}}"。它还会在点击
时调用回调函数<foo label="'bar'" callback="$ctrl.myCallback()"</foo>
到目前为止一切都很好。我的控制器确实得到了回调
所以现在我把这个元素放到一个 ng-repeat 中:
<foo ng-repeat="item in $ctrl.items" label="item.label" callback="$ctrl.myCallback(item)></foo>
我如何在组件中定义点击后传回控制器的内容?该组件没有 item
传递给它,只有 "label"。
根据我读到的内容,我需要说些类似的话
this.callback({item: SomeObject});
我这里有 2 个问题:1) 组件 如何知道 它需要提供 "item" 键和 2) 组件如何知道 SomeObject是?
我可以轻松地在另一个 ng-repeat 中重用该组件:
<foo ng-repeat="order in $ctrl.orders" label="order.orderNum" callback="$ctrl.myCallback(order)></foo>
在这种情况下,组件如何知道将订单对象作为参数发送给点击回调函数?
组件不太了解它,你知道,你的单元测试知道,你的端到端测试知道(可能),但组件只知道它有一个回调(带有命名参数)和一个 属性 和它们的 way-binding
,这就是进行绑定所需要的。此外,您不必从组件端传递任何内容,除非您从组件发送 item 对象,否则,只需使用一个简单的 $ctr.callback()
绑定将调用 $parent.myControllerFunction(item)
来自ng-repeat
范围。
使用 &
时,您可以创建一个委托方法,根据您在模板上创建的掩码从组件调用。例如:
<ANY ng-repeat="item in items" callback="myCallBack(item)">
...
bindings: {
callback: '&'
}
...
如果您从组件中像 $ctrl.callback()
那样调用它,它将使用 ng-repeat
范围内的项目。但是如果你想从组件发送它,那么你必须传递一个对象,其中包含你在模板上使用的参数名称,比如 $ctrl.callback({ item: { name: 'foo'}})
来填充在 callback="myCallBack(item)"
上声明的参数。
angular
.module('mBoard', [])
.component('widget', {
bindings: {
item: '=',
callback: '&'
},
controller: function() {
var $ctrl = this;
$ctrl.save = function() {
//$ctrl.callback();
$ctrl.callback({ item: { name : $ctrl.item.name + '%%%%' }});
}
},
templateUrl: 'template.html'
})
.controller('mBoardCtrl', function mBoardCtrl($interval, $scope) {
$scope.items = [{name: 'uno'}, {name: 'dos'}, {name: 'tres'}];
$scope.setItem = function(item) {
console.log(item)
}
});
/* https://docs.angularjs.org/guide/bootstrap */
angular.bootstrap(document, ['mBoard']);
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.8/angular.js"></script>
<div ng-controller="mBoardCtrl ">
<widget ng-repeat="item in items" item="item" callback="setItem(item)"></widget>
<hr>
<widget ng-repeat="item in items" item="item" callback="setItem('quatorze')"></widget>
<!-- https://docs.angularjs.org/api/ng/service/$templateCache -->
<script type="text/ng-template" id="template.html">
<button type="button" ng-click="$ctrl.save()">{{ $ctrl.item.name }}</button>
</script>
</div>