Сервис всегда нулевой при вызове. net метод из js в blazor - PullRequest
0 голосов
/ 16 июня 2020

Я проверил с помощью this , но все равно получил null.

У меня есть один компонент бритвы, для которого используется datepickerrange. вы можете увидеть ниже. Я вызвал daterangepickerInit для инициализации daterangepicker в OnInitializedAsync(). Здесь я передаю DotNetObjectReference другого компонента под названием BookedHoursWidgetComponent, чтобы получить доступ к его службам.

protected override async Task OnAfterRenderAsync(bool firstRender)
    {
        if (firstRender)
        {
            await Task.Delay(1).ContinueWith(async t =>
            {
                await JSRuntime.InvokeVoidAsync("DateRangePicker.daterangepickerInit");
            });
        }
    }

Ниже приведен код для DateRangePicker.daterangepickerInit.

window.DateRangePicker = {
daterangepickerInit: function (dotNet) {

    if ($('#kt_dashboard_daterangepicker').length == 0) {
        return;
    }

    var picker = $('#kt_dashboard_daterangepicker');
    var start = moment().startOf('month');
    var end = moment().endOf('month');

    function cb(start, end, label) {

        var title = '';
        var range = '';

        if ((end - start) < 100 || label == 'Today') {
            title = 'Today:';
            range = start.format('MMM D');
        } else if (label == 'Yesterday') {
            title = 'Yesterday:';
            range = start.format('MMM D');
        } else {
            range = start.format('MMM D') + ' - ' + end.format('MMM D');
        }

        picker.find('#kt_dashboard_daterangepicker_date').html(range);
        picker.find('#kt_dashboard_daterangepicker_title').html(title);

        Date.prototype.yyyymmdd = function () {
            var mm = this.getMonth() + 1;
            var dd = this.getDate();

            return [this.getFullYear(),
            (mm > 9 ? '' : '0') + mm,
            (dd > 9 ? '' : '0') + dd
            ].join('');
        };

        var graphFilterModel = { StartDate: start.toDate().yyyymmdd(), EndDate: end.toDate().yyyymmdd() };

       // stateManager.save('GraphFilterModel', JSON.stringify(graphFilterModel));

        // window.localStorage['GraphFilterModel'] = JSON.stringify(GraphFilterModel);
        dotNet.invokeMethodAsync('ApplyFilter', graphFilterModel);
        // DotNet.invokeMethodAsync('Momo.Client', 'ApplyFilter', start.toDate().yyyymmdd(), end.toDate().yyyymmdd());
    }

    picker.daterangepicker({
        direction: KTUtil.isRTL(),
        startDate: start,
        endDate: end,
        opens: 'left',
        applyClass: "btn btn-sm btn-primary",
        cancelClass: "btn btn-sm btn-secondary",
        ranges: {
            'This Week': [moment().startOf('week'), moment()],
            'Last Week': [moment().subtract(1, 'week').startOf('week'), moment().subtract(1, 'week').endOf('week')],
            'This Month': [moment().startOf('month'), moment().endOf('month')],
            'Last Month': [moment().subtract(1, 'month').startOf('month'), moment().subtract(1, 'month').endOf('month')]
        }
    }, function (start, end, label) {
        cb(start, end, label);
    });

    cb(start, end, '');
}

}

ниже - это код для BookedHoursWidgetComponent. Итак, вот метод под названием ApplyFilter, который вызывается из js, когда я выбираю диапазон дат. из этого метода я вызываю свой метод загрузки табелей учета рабочего времени, но проблема в том, что я всегда получаю TimesheetService & ChartService null.

ниже мой код для BookedHoursWidgetComponent.

public class BookedHoursWidgetComponent : ComponentBase
{
    [Inject] TimesheetService TimesheetService { get; set; }

    [Inject] ProjectService ProjectService { get; set; }

    [Inject] ChartService ChartService { get; set; }

    [Inject] IMapper Mapper { get; set; }

    [Inject] protected IJSRuntime JSRuntime { get; set; } = null;

    [Inject] IStringLocalizer<Common> Localizer { get; set; }

    protected string BookingHours = string.Empty;

    protected override async Task OnInitializedAsync()
    {
        await ProjectService.GetAllProjects();
        await LoadTimesheet(new GraphFilterModel());
    }

    private async Task LoadTimesheet(GraphFilterModel graphFilterModel)
    {
        var timesheets = await TimesheetService.GetCurrentUserTimesheetsAsync();

        //var filterJson = await JSRuntime.InvokeAsync<string>("stateManager.load", nameof(GraphFilterModel));
        //var graphFilterModel = JsonSerializer.Deserialize<GraphFilterModel>(filterJson);

        var pattern = LocalDatePattern.CreateWithInvariantCulture("yyyyMMdd");
        LocalDate startDate, endDate;
        if (!string.IsNullOrEmpty(graphFilterModel.StartDate) && !string.IsNullOrEmpty(graphFilterModel.EndDate))
        {
            startDate = pattern.Parse(graphFilterModel.StartDate).GetValueOrThrow();
            endDate = pattern.Parse(graphFilterModel.EndDate).GetValueOrThrow();
            timesheets = timesheets.Where(x => x.Date >= startDate && x.Date <= endDate).ToList();
        }

        var bookedHoursTimesheets = Mapper.Map<List<BookedHoursTimesheet>>(timesheets);
        var BookedDuration = new Duration();
        foreach (var timesheet in bookedHoursTimesheets)
        {
            BookedDuration = BookedDuration.Plus(timesheet.Duration);
        }
        BookingHours = BookedDuration.ToString("HH:mm", null);

        // Chart code
        var BookedHoursGraphModelProjectWise = bookedHoursTimesheets.GroupBy(x => x.Project.Name).Select(y => new BookedHoursGraphModel
        {
            Project = y.Key,
            Hours = GetTotalDuration(y)
        }).OrderByDescending(x => x.Hours);

        var ProjectModel = BookedHoursGraphModelProjectWise.Take(9).ToList();
        var Other = BookedHoursGraphModelProjectWise.Where(x => !ProjectModel.Select(y => y.Project).Contains(x.Project));

        ProjectModel.Add(new BookedHoursGraphModel
        {
            Project = Localizer["BookedHoursWidget.Other"],
            Hours = Other.Sum(x => x.Hours)
        });

        string[] BackgroundColors = { Colors.Base.Shape[1], Colors.Base.Shape[2], Colors.State.States["brand"] };

        var GraphDataModel = new GraphDataModel
        {
            Data = ProjectModel.Select(x => x.Hours),
            Labels = ProjectModel.Select(x => x.Project),
            BackgroundColors = BackgroundColors
        };

        var BookedHoursGraphModel = ChartService.GenerateGraphModel(GraphDataModel);

        await JSRuntime.InvokeAsync<string>("CanvasGraph.LoadGraph",
                BookedHoursGraphModel, Settings.WidgetCanvas.BookedHoursWidgetCanvas);
    }

    protected double GetTotalDuration(IGrouping<string, BookedHoursTimesheet> model)
    {
        var Hour = new Duration();
        foreach (var objHours in model.Select(x => x.Duration))
        {
            Hour = Hour.Plus(objHours);
        }
        return Hour.TotalHours;
    }

    [JSInvokable]
    public async Task ApplyFilter(GraphFilterModel graphFilterModel)
    {
        //var pattern = LocalDatePattern.CreateWithInvariantCulture("yyyyMMdd");
        //var startDate = pattern.Parse(start).GetValueOrThrow();
        //var endDate = pattern.Parse(end).GetValueOrThrow();\
        await LoadTimesheet(graphFilterModel);
        // return Task.CompletedTask;
    }
}

Почему я получаю ноль? Также я использую DotNetObjectReference.Create. что мне делать, чтобы не получить услугу null.

Спасибо за помощь!

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