app.js中无法正确识别navigator.language

时间:2016-02-11 20:07:16

标签: javascript angularjs angularjs-scope operators

这是我的控制器

app.controller('languagesCtrl', function($scope) {
  var lang = window.navigator.language || window.navigator.userLanguage;
  if (lang === 'it' || 'it-it' || 'it-IT') {
    $scope.showcase = 'Vetrina';
    $scope.products = 'Prodotti';
    $scope.cta = 'Nuova collezione strumenti';
  } else {
    $scope.showcase = 'Showcase';
    $scope.products = 'Products';
    $scope.cta = 'Check out new products!';
  }
});

即使我确定我的navigator.language不是'it-IT'(已检查here),我的基于角度的网站也不会使用else括号内的内容。

2 个答案:

答案 0 :(得分:2)

你的表达总是如此,你使用||运算符的方式。

表达评估时

第一部分(lang === 'it')可能是truefalse,假设它是假的。

然后表达式变得像(false || 'it-it' || 'it-IT'),它将始终返回返回下一个表达式值,在这种情况下它将是it-it,所以无论如何条件将会得到满足。

将其更改为以下。

if (lang === 'it' || lang === 'it-it' || lang === 'it-IT')

OR事件简化。

if (['it','it-it','it-IT'].indexOf(lang) > -1)

答案 1 :(得分:0)

ES6解决了这个美妙的问题

我只是把它放在这里,因为将来人们会发现这一点。使用includes()表示ES6。

['it','it-it','it-IT'].includes(language)

ES5解决方案

这个东西总是习惯让我,直到我意识到,我正在使用多个OR比较错误。所以我这样做是为了让它更具可读性。

Array.prototype.contains = function(obj) {
    return this.indexOf(obj) > -1;
};

现在,您可以像这样使用它:

var language = $window.navigator.language.

if (['it','it-it','it-IT']].contains(language)) {
    alert('yes');
}

这更具可读性。当然,如果你使用underscore.js,他们有以下帮助器。

_.contains([], search)