Как установить значение по умолчанию для пользовательского переключателя в модальной - PullRequest
0 голосов
/ 26 марта 2019

Справочная информация:

Итак, я работаю с модальным окном для поиска по списку записей задач в базе данных, используя форму для сужения результатов. В этом модальном окне есть пользовательский переключатель, который используется для выбора, выполняется ли задание или нет (простая опция «Да» или «Нет»). Цель состоит в том, чтобы установить параметр «Нет» в качестве значения по умолчанию при каждом вызове модального режима. В настоящее время я использую data-ng-init; однако, это работает только при первом открытии модального окна. Если пользователь закрывает модальное и открывает его снова, значение по умолчанию больше не устанавливается. Ниже приведен пример того, как выглядит эта пользовательская кнопка:

<div class="col-sm-6">
      <div style="margin-bottom:10px">
      <button type="button" data-ng-init="tr.taskInProgress('No')" 
          title="Task In Progress: No" data-ng-click="tr.taskInProgress('No')"
          style="border:0;background:transparent">
      <img src="../images/selected.png" data-ng-switch-when="No" />
      <img src="../images/Deselect.png" data-ng-switch-when="Yes"  />
      <img data-ng-switch-when="" src="/nc/images/Deselect.png" /></button>
          <text>No
   </div>
   (another similar button, but for 'yes')
</div>

В прилагаемом файле .js для заполнения этого мода используется следующее:

/*--------- Get Tasks ---------*/
tr.closeGetTaskModal = closeGetTasModal;
tr.displayGetTaskMessage = true;
tr.selectedStatusType = getStatusType;
tr.trackingId = '';
tr.performGetTask = performGetTask;
tr.isTaskInProgess = isTaskInProgress;

И в том же файле .js для модификации радио используется следующая функция:

function isTaskInProgress(newValue) {
    tr.isTaskInProgress = newValue;
}

Я просматривал другие итерации о том, как они обрабатывают такие случаи, но мне не повезло, и я не нашел ничего достаточно похожего на то, с чем я работаю, это работает. Я попытался установить значение по умолчанию в разделе Get Tasks, изменив isTaskInProgress('No'), но это только заблокировало модальное окно, и я не смог изменить параметр. Я попытался установить значение по умолчанию внутри функции isTaskInProgress; однако, это работало только когда кнопка была нажата, она не смогла установить значение по умолчанию. Я пытался посмотреть, сработает ли data-ng-default; однако, это не было признанным параметром. У кого-нибудь есть предложения о том, как изменить это, чтобы получить желаемые результаты? Заранее всем спасибо за помощь

1 Ответ

1 голос
/ 27 марта 2019

Small Disclaimer

Я позволю себе предположить, что вы используете UT Bootstrap (поскольку я вижу классы начальной загрузки в вашем примере HTML), поэтому в моем примере я буду использовать Uib Modal.

Bootstrap Модальные документы: https://angular -ui.github.io / bootstrap / #! # Модальные


Решение для поиска / обратного вызова

Скорее всего вывы хотите использовать контроллер для установки вашего флага tr.isTaskInProgress вместо использования директивы ng-init (немного больше гибкости / читаемости).

Установите tr.isTaskInProgress в false в верхней части функции вашего целевого контроллера, а затем передайте его значение вашему модальному в качестве свойства в «Модальном объекте разрешения».

Объяснение Bootstrap об объекте разрешения: https://angular -ui.github.io / bootstrap / #! # Ui-router-resolves


Код

function MainController($scope, $uibModal) {
    let vm = this;
    vm.isTaskInProgress = false;

    // When you open the modal, pass in the isTaskProgress value
    let modalInstance = $uibModal.open({
         templateUrl: 'myModalContent.html', // Points to the script template
         controller: 'ModalController', // Points to the controller
         controllerAs: 'mc',
         windowClass: 'app-modal-window',
         backdrop: 'static',
         resolve: {
              isTaskInProgress: function() {
                   // pass the task state to the Modal
                   return vm.isTaskInProgress;
              }
         }
     });

  // handle the value(s) passed back from the modal
  modalInstance.result.then(returnedTaskState => {
    // reassign the returned value of the modal
    if (returnedTaskState !== null) {
      vm.isTaskInProgress = returnedTaskState;
    }
  });
}

Рабочий пример

https://plnkr.co/ryK7rG

В интересах экономии времени я изменил некоторые имена переменных / методов по сравнению с тем, что у вас естьв ваших отрывках.В этом примере вы можете ...

  • Установить значение В прогрессе , прежде чем открывать модальное окно, и модальное значение отражает значение В прогрессе.
  • Измените значение In Progress внутри модального поля.После закрытия модального окна значение будет обновлено на главной странице.

SO Snippet

Я понимаю, что окно SO Snippet не совсем подходящее место для этого примера, но просто добавьте мой пример кода здесь на случай, если Plunker неудобен дляпо какой-то причине.

(function() {
  "use strict";

  let app = angular
    .module("myApp", ["ui.bootstrap"])
    .controller("MainController", MainController);

  MainController.$inject = ["$scope", "$timeout", "$uibModal"];

  function MainController($scope, $timeout, $uibModal) {
    /**
     * John Papa Style Guide
     * https://github.com/johnpapa/angular-styleguide/blob/master/a1/README.md
     * */
    let vm = this;

    // ==== scoped variables ====
    vm.title = "AngularJS - Passing Toggled Values to a Modal"
    vm.taskInProgress = false;
    vm.taskButtonLocked = false;

    // ==== functions hoist ====
    vm.beginTask = _beginTask;

    function _beginTask() {
      vm.modalIsOpen = true;

      // do work

      openModal();
    }

    // ==== local functions ====
    function openModal() {
      // open the modal with configurations
      let modalInstance = $uibModal.open({
        templateUrl: 'myModalContent.html', // Points to my script template
        controller: 'ModalController', // Points to my controller
        controllerAs: 'mc',
        windowClass: 'app-modal-window',
        backdrop: 'static',
        resolve: {
          taskInProgress: function() {
            // pass the task state to the Modal
            return vm.taskInProgress;
          }
        }
      });

      // handle the value(s) passed back from the modal
      modalInstance.result.then(returnedTaskState => {
        // reset control values after modal is closed
        vm.taskButtonLocked = false;
        vm.modalIsOpen = false;

        // reassign the returned value of the modal
        console.log("returnedTaskState: ", returnedTaskState);

        if (returnedTaskState !== null) {
          vm.taskInProgress = returnedTaskState;
        }
      });
    }
  }

})();

(function() {
  'use strict';

  angular
    .module('myApp')
    .controller('ModalController', ModalController);

  ModalController.$inject = ['$scope', '$timeout', '$uibModalInstance', 'taskInProgress'];

  function ModalController($scope, $timeout, $uibModalInstance, taskInProgress) {

    // Assign Cats to a Modal Controller variable
    let vm = this;
    
    vm.inProgress = taskInProgress;
    
    console.log("taskInProgress", taskInProgress)

    $scope.submit = function() {
      $uibModalInstance.close(vm.inProgress);
    }

    $scope.close = function() {
      $uibModalInstance.close(null);
    }
  }
})();
input[type="radio"]:hover {
  cursor: pointer;
}
<!DOCTYPE html>
<html>

<head>
  <meta charset="utf-8" />
  <title>AngularJS Plunk</title>

  <link rel="stylesheet" href="style.css" />
  <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
  <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css" integrity="sha384-wvfXpqpZZVQGK6TAh5PVlGOfQNHSoD2xbE+QkPxCAFlNEevoEH3Sl0sibVcOQVnN" crossorigin="anonymous">

  <!-- JQuery and Bootstrap -->
  <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
  <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/js/bootstrap.min.js"></script>

  <!-- Angular Stuff -->
  <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.7.8/angular.js"></script>
  
   <!-- UI Bootstrap Stuff -->
  <script src="https://cdnjs.cloudflare.com/ajax/libs/angular-ui-bootstrap/2.5.0/ui-bootstrap-tpls.min.js"></script>

  <!-- Our Angularjs App -->
  <script type="text/javascript" src="app.js"></script>
</head>

<body ng-app="myApp" ng-controller="MainController as tr">

  <!-- ==== MAIN APP HTML ==== -->
  <div class="container" style="padding:1em;">
    <div class="row">
      <div class="col-xs-12">
        <div class="jumbotron text-center">
          <h2>{{ tr.title }}</h2>
          <h4><em><a href="/9575045/kak-ustanovit-znachenie-po-umolchaniy-dlya-polzovatelskogo-pereklychatelya-v-modalnoi" target="_blank">SO Question #55362380</a></em></h4>
          <h4><em><a href="https://angularjs.org/" target="_blank">AngularJS - v1.7.8</a></em></h4>
        </div>
      </div>
      <div class="col-xs-12">
        <form>
          <div class="form-group">
            <h3>Task In Progress</h3>
            <div>
              <label>Yes:</label>
              <input type="radio"
                     ng-checked="tr.taskInProgress"
                     ng-click="tr.taskInProgress = true"
                     ng-disabled="tr.modalIsOpen">
            </div>
            <label>No:</label>
            <input type="radio" 
                   ng-checked="!tr.taskInProgress"
                   ng-click="tr.taskInProgress = false" 
                   ng-disabled="tr.modalIsOpen">
          </div>
          <div class="form-group">
            <label>Open the modal:</label>
            <button type="button" 
                    class="btn btn-success" 
                    ng-click="tr.beginTask();" 
                    ng-disabled="tr.taskButtonLocked">
              <span>Begin Task</span>
            </button>
          </div>
        </form>
      </div>
    </div>
  </div>
  
  <!-- ==== MODAL HTML TEMPLATE ==== -->
   <script type="text/ng-template" id="myModalContent.html">
    <div class="modal-header">
      <h3 class="modal-title" id="modal-title">I'm a modal!</h3>
    </div>
    <div class="modal-body" id="modal-body">
        <form>
          <div class="form-group">
            <label>Task State:</label>
            <div style="padding:1em;background:rgba(200, 214, 229,0.3);">
              <p>
                <span ng-show="!mc.inProgress">
                  <span>Task is not in progress...&nbsp;&nbsp;</span>
                  <i class="fa fa-check-square" aria-hidden="true"></i>
                </span>
                <span ng-show="mc.inProgress">
                  <span>Task is in progress...&nbsp;&nbsp;</span>
                  <i class="fa fa-spinner fa-spin" aria-hidden="true"></i>
                </span>
              </p>
            </div>
          </div>
          <div class="form-group" style="padding-top:1em;">
            <h3>Task In Progress</h3>
            <div>
              <label>Yes:</label>
              <input type="radio"
                     ng-checked="mc.inProgress"
                     ng-click="mc.inProgress = true">
            </div>
            <label>No:</label>
            <input type="radio" 
                   ng-checked="!mc.inProgress"
                   ng-click="mc.inProgress = false">
          </div>
        </form>
      </div>
    <div class="modal-footer">
      <button class="btn btn-primary" type="button" ng-click="submit()">OK</button>
      <button class="btn btn-warning" type="button" ng-click="close()">Cancel</button>
    </div>
  </script>

</body>

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