проверка оценки ведет себя ненормально в Laravel - PullRequest
0 голосов
/ 13 июля 2020

В моем приложении Laravel -5.8 у меня есть этот код:

public function findScore(Request $request)
{
    $userCompany = Auth::user()->company_id;
    $userEmployee = Auth::user()->employee_id;
    
    $identities                     = DB::table('identity')->select('id')->where('company_id', $userCompany)->where('is_current', 1)->first()->id;      

   $weightedscore = 0;
   $weightedscore = DB::table('goals')->select(DB::raw("IFNULL(SUM(weighted_score),0) as weighted_score"))->where('identity_id', $identities)->where('employee_id', $userEmployee)->where('parent_id', $parentid)->whereNull('deleted_at')->first();
   $weightedscorex = 0;

   $maxscore = DB::table('goal_types')->select('max_score')->find($child->parent_id);

    return response()->json([
        'maxscore' => $maxscore->max_score,
        'weightedscore' => $weightedscore->weighted_score,
    ]);        
}

Маршрут:

Route::get('get/findScore','GoalsController@findScore')->name('get.scores.all');

view (create.blade. php)

          <div class="col-12 col-sm-6">
            <div class="form-group">
              <label class="control-label"> Goal Type:<span style="color:red;">*</span></label>
              <select id="goal_type" class="form-control @error('goal_type_id') is-invalid @enderror" name="goal_type_id">
              <option value="">Select Goal Type</option>

                @foreach ($categories as $category)
                @unless($category->name === 'Job Fundamentals')
                  <option hidden value="{{ $category->id }}" {{ $category->id == old('goal_type_id') ? 'selected' : '' }}>{{ $category->name }}</option>

                  @if ($category->children)
                    @foreach ($category->children as $child)
                    @unless($child->name === 'Job Fundamentals')
                      <option value="{{ $child->id }}" {{ $child->id == old('goal_type_id') ? 'selected' : '' }}>&nbsp;&nbsp;{{ $child->name }}</option>
                    @endunless
                    @endforeach
                  @endif
                  @endunless
                @endforeach
              </select>

    <input type="hidden" id="max_score" class="form-control" >
    <input type="hidden" id="weighted_score" value="0" class="form-control" >


          <div class="col-12 col-sm-6">
            <div class="form-group">
              <label class="control-label"> Weight(%):<span style="color:red;">*</span></label> 
              <input  type="text" name="weighted_score" id="total_weighted_score" value="{{ old('weighted_score', $goal->weighted_score) }}" placeholder="Enter weighted score here" class="form-control @error('weighted_score') is-invalid @enderror" max="120" onkeyup="checkScore(this.value)">
            </div>
          </div>  

    <div class="card-footer">
      <button type="submit" class="btn btn-primary">Save</button>
    </div>           

Javascript

    <script type="text/javascript">
    $(document).ready(function() {
        $(document).on('change', '#goal_type', function() {
            var air_id =  $(this).val();

            var a = $(this).parent();
            var op = "";
            
            $.ajax({
                type: 'get',
                url: '{{ route('get.scores.all') }}',
                data: { 'id': air_id },
                dataType: 'json',      //return data will be json
                success: function(data) {
                    console.log(data.maxscore);
                    console.log(data.weightedscore);
                     $('#max_score').val(data.maxscore);
                     $('#weighted_score').val(data.weightedscore);
                },
                error:function(){

                }
            });
        });
    });
    </script>
    <script type="text/javascript">
        function checkScore(value){
            let max_score = $("#max_score").val();
            let weighted_score = $("#weighted_score").val();
            let sumValue = parseInt(weighted_score) + parseInt(value);

            if (sumValue > max_score) {
              alert("sum value is greater than max score");
              $("#total_weighted_score").val('');
              return false;
            }
        }
    </script>

При изменении раскрывающегося списка с помощью id = "goal_type" я загружал max_score выбранного типа цели. onkeyup = "checkScore (this.value)" используется для проверки, если накопленный взвешенный балл превышает max_score. Если да, то появляется предупреждение:

alert («Суммарное значение больше максимального балла»);

Это очень хорошо работает в большинстве случаев. Однако я обнаружил, что проверка нестабильна. Иногда это не работает. Он выдает предупреждение, даже если суммарный взвешенный балл меньше max_score. Проблема возникает при различных сценариях ios. Но иногда, когда пользователь пытается ввести значение в текстовый ввод, не выбирая раскрывающийся список.

Как мне решить эту проблему?

1 Ответ

0 голосов
/ 13 июля 2020

Это не обязательно оптимальное решение, но должно решить вашу проблему. Если ajax еще не вернул ваши значения, просто инициализируйте их так, чтобы они не вызывали вашу ошибку.

function checkScore(value) {
    let max_score = $("#max_score").val();
    max_score = max_score ? parseInt(max_score) : Number.MAX_SAFE_INTEGER;

    let weighted_score = $("#weighted_score").val();
    weighted_score = weighted_score ? parseInt(weighted_score) : 0;
    
    let sumValue = weighted_score + parseInt(value);
    
    if (sumValue > max_score) {
        alert("sum value is greater than max score");
        $("#total_weighted_score").val('');
        return false;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...