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

navigator.language not recognized correctly in app.js

这是我的控制器

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),我基于 angular 的网站也不会使用里面的内容在 else 的括号中。

你的表达式永远是真的,就像你使用 || 运算符的方式。

表达式计算时

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

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

改成下面。

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

或简化事件。

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

ES6 完美解决了这个问题

我只是把它放在这里以防将来人们偶然发现它。对 ES6 使用 includes()

['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)