指令范围始终为空
Directive Scope always empty
勾选这个JSFiddle
app.directive('rateClass', function() {
function link ($scope, $element, $attrs) {
var className = '';
if($scope.ranking > 9)
className = 'ranked-excelent';
else if($scope.ranking > 6)
className = 'ranked-good';
else if($scope.ranking > 3)
className = 'ranked-regular';
else if($scope.ranking > 0)
className = 'ranked-bad';
console.log($scope, className);
};
return {
scope: {
rank: '='
},
restrict: 'AEC',
link: link
};
});
我的指令有效,实际上它执行了 link 函数,但是变量 className 没有被填充,即使 $scope 获得了等级属性(检查 console.log),当我访问它 $scope.rank
returns 一个空字符串。
这里发生了什么?
更新
查看全文demo
更新 2 用这个
解决了
app.directive('rateClass', function() {
var getClass = function (val) {
var className = 'not-ranked';
if(val > 9)
className = 'ranked-excelent';
else if(val > 6)
className = 'ranked-good';
else if(val > 3)
className = 'ranked-regular';
else if(val > 0)
className = 'ranked-bad';
return className;
}
function link ($scope, $element, $attrs) {
$scope.$watch($attrs.score, function (value) {
$element.addClass(getClass(value));
})
};
return {
link: link
};
});
您将范围 属性 定义为 rank
但在您的 link 函数中您引用了一个名为 ranking
的变量
你打错了,你用了 $scope.ranking
而不是 $scope.rank
function link ($scope, $element, $attrs) {
var className = '';
if($scope.rank > 9)
className = 'ranked-excelent';
else if($scope.rank > 6)
className = 'ranked-good';
else if($scope.rank > 3)
className = 'ranked-regular';
else if($scope.rank > 0)
className = 'ranked-bad';
console.log($scope, className);
};
已更新fiddle:
http://jsfiddle.net/cobo3wzu/2/
注意:在您编辑的完整演示版本中,您应该输入:
$scope.$watch('score', function (value) {
value = parseFloat(value) || 0;
$element.addClass(getClass(value));
})
而不是:
$scope.$watch($attrs.score, function (value) {
value = parseFloat(value) || 0;
$element.addClass(getClass(value));
})
这是因为,在目录中,您将 score
属性 绑定到 scope
。通过检查 $attrs.score
,您实际上检查的是这个结果:"local.promedio_general"
勾选这个JSFiddle
app.directive('rateClass', function() {
function link ($scope, $element, $attrs) {
var className = '';
if($scope.ranking > 9)
className = 'ranked-excelent';
else if($scope.ranking > 6)
className = 'ranked-good';
else if($scope.ranking > 3)
className = 'ranked-regular';
else if($scope.ranking > 0)
className = 'ranked-bad';
console.log($scope, className);
};
return {
scope: {
rank: '='
},
restrict: 'AEC',
link: link
};
});
我的指令有效,实际上它执行了 link 函数,但是变量 className 没有被填充,即使 $scope 获得了等级属性(检查 console.log),当我访问它 $scope.rank
returns 一个空字符串。
这里发生了什么?
更新
查看全文demo
更新 2 用这个
解决了app.directive('rateClass', function() {
var getClass = function (val) {
var className = 'not-ranked';
if(val > 9)
className = 'ranked-excelent';
else if(val > 6)
className = 'ranked-good';
else if(val > 3)
className = 'ranked-regular';
else if(val > 0)
className = 'ranked-bad';
return className;
}
function link ($scope, $element, $attrs) {
$scope.$watch($attrs.score, function (value) {
$element.addClass(getClass(value));
})
};
return {
link: link
};
});
您将范围 属性 定义为 rank
但在您的 link 函数中您引用了一个名为 ranking
你打错了,你用了 $scope.ranking
而不是 $scope.rank
function link ($scope, $element, $attrs) {
var className = '';
if($scope.rank > 9)
className = 'ranked-excelent';
else if($scope.rank > 6)
className = 'ranked-good';
else if($scope.rank > 3)
className = 'ranked-regular';
else if($scope.rank > 0)
className = 'ranked-bad';
console.log($scope, className);
};
已更新fiddle: http://jsfiddle.net/cobo3wzu/2/
注意:在您编辑的完整演示版本中,您应该输入:
$scope.$watch('score', function (value) {
value = parseFloat(value) || 0;
$element.addClass(getClass(value));
})
而不是:
$scope.$watch($attrs.score, function (value) {
value = parseFloat(value) || 0;
$element.addClass(getClass(value));
})
这是因为,在目录中,您将 score
属性 绑定到 scope
。通过检查 $attrs.score
,您实际上检查的是这个结果:"local.promedio_general"