Javascript 如何与ng switch中的全局变量进行比较
我正在使用AngularJSJavascript 如何与ng switch中的全局变量进行比较,javascript,angularjs,ng-switch,rootscope,Javascript,Angularjs,Ng Switch,Rootscope,我正在使用AngularJS$rootScope对象公开一些控制器和视图都需要访问的全局常量: var app = angular.module('myApp', []); app.run(function ($rootScope) { $rootScope.myConstant = 2; }); 当我尝试在视图中渲染全局值时,它会正常工作: {{myConstant}} 同样,如果我在ng if条件中引用全局值,它也会起作用: <span ng-if="someValue
$rootScope
对象公开一些控制器和视图都需要访问的全局常量:
var app = angular.module('myApp', []);
app.run(function ($rootScope) {
$rootScope.myConstant = 2;
});
当我尝试在视图中渲染全局值时,它会正常工作:
{{myConstant}}
同样,如果我在ng if
条件中引用全局值,它也会起作用:
<span ng-if="someValue == myConstant">Conditional content</span>.
条件内容。
但是,当尝试在ng开关
块内使用相同的值进行比较时,它的计算结果永远不会为true。演示了我如何使其工作。我还尝试将常量值显式引用为$rootScope
的成员和表达式(在双大括号内),但没有任何效果
知道我做错了什么吗
谢谢
Tim当时,您可以自定义
ng开关打开
表达式,以在myConstant
等于项时生成特定值。值
:
<span ng-switch on="{true:'const', false: item.value}[myConstant == item.value]">
<span ng-switch-when="const">
<span class="blue">{{item.name}}</span> (emphasis applied by ng-switch)
</span>
<span ng-switch-when="4">
<span class="red">{{item.name}}</span> (emphasis applied by ng-switch)
</span>
<span ng-switch-default>
{{item.name}}
</span>
</span>
{{item.name}}(由ng开关应用强调)
{{item.name}}(由ng开关应用强调)
{{item.name}
.您可以随时滚动您自己的…:) (不确定这有多高效,而且没有像我刚才写的那样经过很好的测试)
app.directive('wljSwitch',function(){
返回{
控制器:功能($scope){
var_值;
this.getValue=函数(){
返回_值;
};
this.setValue=函数(值){
_价值=价值;
};
var _whenCount=0;
this.addWhen=函数(值){
_WhenCount++;
}
this.removeWhen=函数(值){
_当计数--;
}
this.hasWhens=函数(){
当计数<-1时返回_;
};
},
链接:功能(范围、元素、属性、控制器){
范围:$watch(函数(){
返回范围$eval(attrs.wljSwitchOn);
},函数(值){
控制器。设置值(值);
});
}
};
});
app.directive('wljSwitchWhen',function(){
返回{
要求:“^wljSwitch”,
模板:“”,
是的,
替换:正确,
链接:功能(范围、元素、属性、控制器){
范围:$watch(函数(){
返回controller.getValue()==范围$eval(attrs.wljSwitchWhen);
},函数(值){
如果(值){
controller.addWhen();
}否则{
controller.removeWhen();
}
元素属性('style',value?'':'display:none;');
});
}
};
});
app.directive('wljSwitchDefault',function(){
返回{
要求:“^wljSwitch”,
模板:“”,
是的,
替换:正确,
链接:功能(范围、元素、属性、控制器){
范围$watch(controller.hasweens,函数(值){
元素属性('style',value?'':'display:none;');
});
}
};
});
与ng switch指令的工作原理不同。其他人也发表了类似的评论。这里是我发现的另一个JSFIDLE,它突出了这个问题:现在看来,当时,您不可能有一个动态的ng开关。或者,您可以使用ngIf
。这是一种有趣的方法,它当然可以让我的原始示例正常工作,但这不是创建“if”条件的另一种方式吗?我真正的目标是使用ng开关在多个不同的常量值之间切换。是否可以调整您的语法以支持该功能?我可能会运行switch-on函数,该函数将执行与expression相同的工作。查看修改后的多常数示例。我想知道为什么这不起作用,至少在最新的稳定角度版本1.2.2中是这样。通过查看angular源代码,我看到了以下内容:ng if观察在其链接函数中注入的作用域。ng开关在其链接功能中观察注入的示波器。因此,在这种情况下,$rootScope可用于所有其他派生范围,这两个派生范围都应该在相同的上下文中解析它们的表达式变量。
app.directive('wljSwitch', function () {
return {
controller: function ($scope) {
var _value;
this.getValue = function () {
return _value;
};
this.setValue = function (value) {
_value = value;
};
var _whensCount = 0;
this.addWhen = function (value) {
_whensCount++;
}
this.removeWhen = function (value) {
_whensCount--;
}
this.hasWhens = function () {
return _whensCount < -1;
};
},
link: function (scope, element, attrs, controller) {
scope.$watch(function () {
return scope.$eval(attrs.wljSwitchOn);
}, function (value) {
controller.setValue(value);
});
}
};
});
app.directive('wljSwitchWhen', function () {
return {
require: '^wljSwitch',
template: '<span ng-transclude></span>',
transclude: true,
replace: true,
link: function (scope, element, attrs, controller) {
scope.$watch(function () {
return controller.getValue() === scope.$eval(attrs.wljSwitchWhen);
}, function (value) {
if (value) {
controller.addWhen();
} else {
controller.removeWhen();
}
element.attr('style', value ? '' : 'display:none;');
});
}
};
});
app.directive('wljSwitchDefault', function () {
return {
require: '^wljSwitch',
template: '<span ng-transclude></span>',
transclude: true,
replace: true,
link: function (scope, element, attrs, controller) {
scope.$watch(controller.hasWhens, function (value) {
element.attr('style', value ? '' : 'display:none;');
});
}
};
});