#nativescript
#nativescript
Вопрос:
В базовом приложении NativeScript у меня есть динамически отображаемый список пользователей, и для каждого пользователя есть два элемента переключения; один для участия и один для назначения.
Во-первых, как я могу привязать событие «checkedChange» ко всем элементам Switch в этом списке сразу, после загрузки или перезагрузки списка (а не к каким-либо другим элементам Switch на этой странице)?
Во-вторых, переключатель назначения должен быть включен только в том случае, если установлен флажок участия, или отключен и снят флажок другим способом. Как этого можно добиться хорошим способом?
В-третьих, событие запускает функцию, которая должна сохранять изменения. Как я должен получить информацию о типе (задействовать или назначить) и идентификаторе пользователя?
Для уточнения:
Я знаю о методе присвоения элементу switch идентификатора и привязки его статически, например:
const mySwitch = page.getViewById("mySwitch");
mySwitch.on("checkedChange", (args) => {
// Do something
});
и
<Switch id="mySwitch" .../>
Но в этом случае я загружаю список пользователей из API, используя ViewModel и observableArray. Каждая запись содержит два элемента Switch, и присвоение им уникальных идентификаторов и привязка каждого из них кажется плохим решением.
Если бы это было веб-приложение, я бы добавил дополнительные атрибуты к элементу Switch, например:
<Switch data-type="user-involvement" data-uid="10" .../>
и изменения коллективной привязки ко всем элементам, где тип данных — «участие пользователя».
Есть ли какой-либо способ сделать что-то подобное в ядре {N}?
Ответ №1:
-
Если вы используете версию ядра {N}, то вы должны иметь возможность добавлять
checkedChange
прослушиватель приloaded
событииSwitch
. -
В
checkedChange
событииSwitch
вы могли бы обновитьchecked
свойство otherSwitch
, обновив наблюдаемый атрибут, с которым он связан.
Комментарии:
1. Привязка статических элементов Switch не является проблемой, это привязка checkedChange к списку динамических элементов (где привязка идентификатора не кажется мне хорошим решением)… пожалуйста, посмотрите дополнительное разъяснение, которое я добавил к своему первоначальному вопросу.
2. Как я уже упоминал в своем ответе, используйте загруженное событие самого Switch вместо страницы, чтобы вы могли сделать что-то вроде
args.object.on('checkedChange', listener);
.
Ответ №2:
Я здесь создал для вас пример игровой площадки. При начальной загрузке в youe XML у вас может быть 2 переключателя, и вы можете управлять вторым переключателем на основе состояния первого переключателя.
<Switch checked="{{involved}}" loaded="switchLoaded" />
<Switch checked="{{assigned}}" isEnabled="{{involved}}" />
находясь в вашем js-файле.
countries: [
{ name: "User 1", involved: true, assigned: false },
{ name: "User 2", involved: true, assigned: false },
{ name: "User 3", involved: false, assigned: false },
{ name: "User 4", involved: true, assigned: false },
{ name: "User 5", involved: true, assigned: false },
],
Также вы можете привязать слушателей к загруженному методу.
function switchLoaded(args) {
console.log(args.object.bindingContext);
args.object.on("checkedChange", (args) => {
console.log("checkedChange ", args.object.checked);
});
}
В args.object.BindingContext у вас есть доступ к данным, которыми вы можете управлять.
Комментарии:
1. Спасибо, еще не пробовал, но это выглядит именно так, как я ищу!
2. Отлично, я также добавил ссылку на образец playground, который вы можете использовать. Вы можете повысить голос за ответ, чтобы люди с аналогичной проблемой могли получить выгоду.
3. Кстати, есть идеи, как изменить модель представления, наблюдаемую при смене переключателя? Т.Е. если задействованный переключатель становится false , назначенный для этого пользователя, также должен измениться на false … Я пробовал что-то подобное
homeViewModel.forEach(function(e,i){ if (args.object.bindingContext.name==e.name) { homeViewModel.set("homeViewModel[" i "]['assigned']",true); } });
… но без изменений…