Как использовать троичный оператор, используя _.map в angularjs - PullRequest
0 голосов
/ 23 марта 2020

Мне нужно вернуть истину или ложь на основании какого-либо условия, я не получаю более чистый код для этого:

Мне нужно скрыть или показать некоторые элементы пользовательского интерфейса на основе этого условия, которые должны возвращать истину или ложь:

scope.isDataEnabled =function(options){ //Here if supppose a comes,
                           // then i need to send true, otherwise false
    if(!$rootScope.currentProduct.id ==
        ProductConstants.BB_PRODUCT_ID){
            return true;
        }
   else{
       _.map( $rootScope.currentUser.permissions, permissionObj =>{
           // permissions is an Array
           return (permissionObj.module == "BB_DATASET" &&
              permissionObj.values == "b" && options=="a") //need to send true 
                                           //if this condition satisfies
       });
    }
    return false; //but i am going mad here, after returning true,
                  //it comes to this line and sets to false
}

Пожалуйста, помогите мне руководство, что я должен использовать, чтобы достичь этого. Я думал об использовании троичного оператора, но не понимал, как использовать его внутри карты.

Ответы [ 2 ]

1 голос
/ 23 марта 2020

Может помочь упрощение вашего кода до минимального сценария тестирования, которым можно манипулировать (и просто использовать старый добрый ES20xx). Что-то вроде:

let $rootScope = {
  currentProduct: {
    id: `x`
  },
  currentUser: {
    permissions: [{
      module: `BB_DATASET`,
      values: `b`
    }, {
      module: `some`,
      values: `a`
    }]
  }
};
const ProductConstants = {
  BB_PRODUCT_ID: `y`
}

console.log(testMe(`a`)); // true (currentProduct.id not BB_PRODUCT_ID)

ProductConstants.BB_PRODUCT_ID = `x`;
console.log(testMe(`a`)); // true (module && values && options)

$rootScope.currentUser.permissions[0].module = `AA_DATASET`;
console.log(testMe(`a`)); // false (module not BB_DATASET)

$rootScope.currentUser.permissions[0].module = `BB_DATASET`;
console.log(testMe(`b`)); // false (options not `a`)

$rootScope.currentUser.permissions[0].values = `c`;
console.log(testMe(`a`)); // false (values not `b`)

function testMe(options) {
  if ($rootScope.currentProduct.id !== ProductConstants.BB_PRODUCT_ID) {
    return true;
  }
  const found = $rootScope.currentUser.permissions.find( v =>
    v.module === `BB_DATASET` &&
    v.values === `b` &&
    options == `a`);
  return found ? true : false;

}
.as-console-wrapper {
  top: 0;
  max-height: 100% !important;
}
1 голос
/ 23 марта 2020

Во-первых, возврат внутри функции карты не вернет значение внешней функции, вы возвращаете результат только самой функции карты. Результат функции карты никогда не возвращается.

Кроме того, я думаю, что вы можете использовать _.some вместо карты. map используется для преобразования данных, в то время как some используется для проверки того, соответствует ли что-либо условию.

return _.some($rootScope.currentUser.permissions, permissionObj => {
    return (permissionObj.module == "BB_DATASET"
        && permissionObj.values == "b" 
        && options=="a")
});

Это будет проверять, соответствуют ли любые разрешений данному условию , В качестве альтернативы вы можете использовать _.all, если хотите, чтобы все соответствовало условию.

...