我正试图绕过Angular 1组件。我编写了一个简单的组件,它可以在init上设置背景颜色,然后通过按钮点击更改颜色。
以下是代码:
<shadow colour="black"></shadow>
app.component('shadow', {
bindings: {
colour: '='
},
controller: function() {
function setColour(col) {
this.colour = col;
}
},
scope: {},
template: ['<div ',
'style="background: {{ shadow.colour }}; width: 100px; height: 100px;">',
'<button ng-click="shadow.setColour(red)">Button</button>',
'</div>'].join('')
});
不幸的是,它不起作用。根据我的阅读,当没有传递controllerAs
时,Angular会假设组件名称是控制器名称。所以我确实试着这样写。我哪里出错了?
答案 0 :(得分:1)
Angular会自动使用名称&#39; $ ctrl&#39;如果没有通过controllerAs。来自角度来源:
controllerAs: identifierForController(options.controller) || options.controllerAs || '$ctrl',
编辑1:
编辑2:
更正的代码将是这样的:
app.component('shadow', {
bindings: {
colour: '@'
},
controller: function() {
this.colourSecondary = 'red';
this.setColour = setColour;
function setColour(colour) {
this.colour = colour;
}
},
scope: {},
template: ['<div ',
'style="background: {{ $ctrl.colour }}; width: 100px; height: 100px;">',
'<button ng-click="$ctrl.setColour($ctrl.colourSecondary);">Button</button>',
'</div>'].join('')
});
绑定&#39; @&#39;采用字符串或插值变量,例如{{color}}。
使用&#39; =&#39;,angular需要一个名为&#39; color&#39;的范围变量。这不存在。
答案 1 :(得分:0)
我会这样做:
angular
.module('yourModule')
.directive('shadow', shadow);
function shadow() {
return {
scope: {
colour: '=?'
},
restrict: 'AE',
template: '<div style="background: {{colour}}; width: 100px; height: 100px;"></div>'
};
}
在html中:
<button ng-click="setColor('red')">Button</button>
<shadow color="{{yourColor}}"></button>
并在您的主要指令中:
$scope.setColor = function(newColor){
$scope.yourColor = newColor;
}