Разница между "@MethodName" и "MethodName" в Blazor при передаче методов в качестве параметра? - PullRequest
4 голосов
/ 16 апреля 2020

У меня есть компонент в Blazor, который принимает методы в качестве параметров.

<SuppliersTable Loader="@LoadS" LoaderO="@LoadO" Adder="@Add" Updater="@Update" Remover="@Remove" />

@code {
    async Task<List<Supplier>> LoadS() => (await ModelServiceS.GetAllAsync()).ToList();
    async Task<List<Operator>> LoadO() => (await ModelServiceO.GetAllAsync()).ToList();
    async Task<bool> Add(Supplier model) => await ModelServiceS.AddAsync(model);
    async Task<bool> Update(Supplier model) => await ModelServiceS.UpdateAsync(model);
    async Task<bool> Remove(Supplier model) => await ModelServiceS.RemoveAsync(model);
}

Но если вы не поставите «@» перед именами методов, будет ли это что-то совершенно другое? Компилятор принимает оба пути, поэтому я спрашиваю. У меня такое ощущение, что с "@" он выполняет метод и передает возвращаемое значение в качестве параметра, а без "@" вы просто ссылаетесь на методы, которые будут вызываться родительским компонентом (что я и хочу). Может ли кто-нибудь предоставить мне более подробную информацию об использовании "@"?

Типы параметров компонента SuppliersTable следующие:

[Parameter] public Func<Task<List<Supplier>>> Loader { get; set; }
[Parameter] public Func<Task<List<Operator>>> LoaderO { get; set; }
[Parameter] public Func<Supplier, Task<bool>> Adder { get; set; }
[Parameter] public Func<Supplier, Task<bool>> Updater { get; set; }
[Parameter] public Func<Supplier, Task<bool>> Remover { get; set; }

Ответы [ 2 ]

6 голосов
/ 16 апреля 2020

Это вопрос старого и нового синтаксиса. В фазе предварительного просмотра Blazor было много изменений, одна крупная очистка была в Preview 6 :

В этом выпуске Blazor мы стандартизировали общий синтаксис для атрибутов директивы .

  • @onclick="IncrementCount" теперь является стандартной формой для обработчиков событий.

  • @onclick="@IncrementCount" работает хорошо, но вы должны учитывать это для только обратная совместимость.

  • @onclick="() => IncrementCount(step)" тоже работает, используйте его для передачи параметров. В противном случае это просто ненужный дополнительный шаг.

  • onclick="aJsFunction" для вызова JavaScript.

То же самое относится к значениям ваших [Parameter] свойств, но им не требуется (или не разрешается) префикс @.

5 голосов
/ 16 апреля 2020

В ситуациях, когда это работает в любом случае, результат одинаков в любом случае. Вы не разыменовываете метод (то есть ()), поэтому он не будет выполнять метод; Вы все еще передаете ссылку.

То, к чему это сводится, - то, что @ явно пинает Разор в анализе. Существуют определенные ситуации, когда Razor не может интерпретировать, что он должен или должен что-то делать, что вы обычно сможете увидеть с помощью подсветки intellisense. В этих случаях вы должны добавить знак @. Однако, если Razor уже понял это, добавление @ по сути ничего не делает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...