我正在使用AngularJS在UI上工作并从jQuery过渡。 UI本身是一个向导,其中一个步骤具有子步骤,应该通过按下按钮激活这些子步骤。这是我目前的解决方案。
AngularJS代码
.controller('StepCtrl', function($scope) {
$scope.substeps = [];
$scope.activeStep = '';
$scope.isActive = function(stepName) {
// this is never called
return activeStep == stepName;
}
$scope.changeActiveStep = function(newStepName) {
$scope.activeStep = newStepName;
};
})
.directive('subStep', function() {
return {
transclude: true,
restrict: 'A',
link: function($scope, $element, $attrs) {
// this is never called
var name = $attrs.name;
$scope.substeps.push(name);
},
compile: function($element, $attrs) {
var stepName = $attrs.name;
$element.attr('ng-show', 'isActive(\''+stepName+'\')');
}
}
})
.directive('activateSubStep', function() {
return {
link: function($scope, $element, $attrs) {
var enabledStep = $attrs.activateSubStep;
$element.on('click', function() {
$scope.changeActiveStep(enabledStep);
});
}
};
})
JADE布局
.step(ng-controller='StepCtrl')
p Pick an option
button.btn-default(activate-sub-step='sub-step-1') Sub-Step 1
button.btn-default(activate-sub-step='sub-step-2') Sub-Step 2
.sub-step(sub-step name='sub-step-1')
....
.sub-step(sub-step name='sub-step-2')
....
我们的想法是,点击Sub Step 1按钮,我将显示.sub-step(sub-step name='sub-step-1')
的视图。但是我目前的问题是link
指令上的subStep
没有被调用,这意味着子步骤没有在控制器中注册,isActive()
也没有被调用由子步ng-show
属性调用。
按钮工作正常。我的印象是transclude
- 子步骤允许他们看到' StepCtrl
范围,因此可以调用isActive
和/或推送到substeps
,但事实并非如此。
奇怪的是,compile
上的subStep
被调用, 正常工作。没有编译器错误,link
上的subStep
根本没有被调用。
做什么?
答案 0 :(得分:0)
原来,compile
必须返回link
。有一些我没想到的东西。