Труба «может» не может быть найдена - PullRequest
0 голосов
/ 14 февраля 2020

Я пытаюсь реализовать CASL менеджер способностей для моего angular 8 приложения. Я сделал все, что описано в руководстве по использованию пакета, но в моем component html template.

The pipe 'can' could not be found

есть ошибка около can pipe. Итак, вот мой модуль приложения:

@NgModule({
    declarations: [],
    imports: [
...
        AbilityModule.forRoot()
    ],
    exports: [],
    providers: [
...
        { provide: Ability, useFactory: createAbility }
    ],
    bootstrap: [AppComponent]
})

Я реализовал как этот пример casl . * Ниже показана функция

createAbility:

import { AbilityBuilder, Ability } from '@casl/ability'
import { User, Claim } from '@/_models';
import { ABILITIES } from './const-variables';

var user = localStorage.getItem('currentUser');
var currentUser = JSON.parse(user) as User;

export function defineAbilitiesFor(user: User) {
  const { can, rules } = AbilityBuilder.extract();

  if (user.roles.includes("Admin")) {
    can("manage", "all");
  } else {
    user.claims.forEach(claim => {
      ABILITIES.map(ability => {
        if (ability.name === (claim as Claim).type) {
          can(ability.name, ability.module);
        }
      })
    });
  }
  return rules;
}

export function createAbility() {
  return new Ability(defineAbilitiesFor(currentUser), {
    subjectName(subject) {
      if (!subject || typeof subject === "string") {
        return subject;
      }
      return subject.__typename;
    }
  });
}

Я бы также сказал, что она работает в моем классе компонентов с this.ability.can() вводя Ability класс. Но он не может работать с can pipe

Что мне делать, чтобы избавиться от этой ошибки?

Спасибо

1 Ответ

0 голосов
/ 14 февраля 2020

Вы создали свою способность? Я вижу, что вы определили useFactory: createAbility, но из документов приведен пример:

import { AbilityBuilder } from '@casl/ability'

export const ability = AbilityBuilder.define(can => {
   can('read', 'all')
})

Что произойдет, если вы измените его на useValue и создадите определение на основе примера?

...