Плагин ICheck не работает с подсписком в Knockout.js - PullRequest
0 голосов
/ 09 мая 2019

У меня есть модель Knockout, содержащая наблюдаемую bool и список объектов, которые содержат наблюдаемую bool.

У меня есть пользовательская привязка iCheckedSys, для bool в модели, для работы с iCheck, и пользовательская привязка iCheckedPrimary для работы с iCheck на bool в объектах в списке модели.

iCheckedSys работает правильно, а valueAccessor() возвращает наблюдаемое. Однако в списке valueAccessor() возвращает false в iCheckedPrimary.

Если я просто использую флажок для списка объектов, он работает просто отлично.

Как мне заставить iCheck работать со списком объектов? Большое спасибо.

<div class="form-horizontal no-margin form-border" data-bind="UserViewModel">
   <label>
      <input type="checkbox" data-bind="iChecked: IsSysAdmin">
   </label>

   <tbody data-bind="foreach: RolesList">
      <td><input type="checkbox" data-bind="checked: IsPrimary" /></td>
   </tbody>
</div>
<script>
var Role = function () {
   var self = this;
   self.ID = ko.observable();
   self.IsPrimary = ko.observable();
};

var UserViewModel = function () {
   var self = this;
   self.ID = ko.observable(@Html.Raw(Json.Encode(Model.ID)));
   self.IsSysAdmin = ko.observable(@Html.Raw(Json.Encode(Model.IsSysAdmin)));
   self.RolesList = ko.observableArray();

   ko.bindingHandlers.iChecked = {
      init: function (element, valueAccessor) {
         $(element).iCheck({
            checkboxClass: "icheckbox_minimal-green",
            radioClass: "iradio_minimal-green", increaseArea: "20%"
         });
         $(element).on('ifChanged', function () {
            var observable = valueAccessor();
            observable($(element)[0].checked);
         });
      },
      update: function (element, valueAccessor) {
         var value = ko.unwrap(valueAccessor());
         if (value) {
            $(element).iCheck('check');
         } else {
            $(element).iCheck('uncheck');
         }
      }
   };
};

var viewModel = new UserViewModel();
ko.applyBindings(viewModel);
</script>

1 Ответ

0 голосов
/ 29 мая 2019

Я понял, что независимо от того, с какой записью я изменил iCheckedPri, в valueAccessor передается только последняя запись в viewModel.RolesList. Таким образом, текущая запись и ее значение не были доступны.

Я не знаю, правильно ли это ... но вместо значения я передал iCheck самому объекту записи, обновил его текущим значением флажка и обновил iCheck (check / uncheck) значением объекта.

<td><input type="checkbox" data-bind="iCheckedPri: $rawData"></td>
ko.bindingHandlers.iCheckedPri = {

        $(element).on('ifChanged', function (event) {
            var observable = valueAccessor();
            observable = $(element)[0].checked;
            valueAccessor().IsPrimary = this.checked;
        });
    },
    update: function (element, valueAccessor) {
        var value = ko.unwrap(valueAccessor());
        if (value.IsPrimary) {
            $(element).iCheck('check');
        } else {
            $(element).iCheck('uncheck');
        }
    }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...