Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Nativescript “我如何跟踪”;“已检查更改”;列表中多个开关元素的事件?_Nativescript - Fatal编程技术网

Nativescript “我如何跟踪”;“已检查更改”;列表中多个开关元素的事件?

Nativescript “我如何跟踪”;“已检查更改”;列表中多个开关元素的事件?,nativescript,Nativescript,在NativeScript核心应用程序中,我有一个动态呈现的用户列表,对于每个用户,有两个开关元素;一个用于参与,一个用于分配 首先,在加载或重新加载列表后,如何将“checkedChange”事件一次绑定到该列表中的所有开关元素(而不是该页面上的任何其他开关元素) 其次,只有在选中参与开关或禁用和取消选中elsehow时,才应启用分配开关。如何以良好的方式实现这一点 第三,该事件触发一个函数,该函数被假定为保存更改。我应该如何检索有关类型(包括或分配)和用户id的信息 澄清: 我知道给swi

在NativeScript核心应用程序中,我有一个动态呈现的用户列表,对于每个用户,有两个开关元素;一个用于参与,一个用于分配

首先,在加载或重新加载列表后,如何将“checkedChange”事件一次绑定到该列表中的所有开关元素(而不是该页面上的任何其他开关元素)

其次,只有在选中参与开关或禁用和取消选中elsehow时,才应启用分配开关。如何以良好的方式实现这一点

第三,该事件触发一个函数,该函数被假定为保存更改。我应该如何检索有关类型(包括或分配)和用户id的信息

澄清:

我知道给switch元素一个ID并静态绑定它的方法,如:

 const mySwitch = page.getViewById("mySwitch");
 mySwitch.on("checkedChange", (args) => {
   // Do something
 });


但在本例中,我使用ViewModel和ObservableArray从API加载用户列表。每个记录包含两个开关元素,给它们唯一的ID并绑定每个元素似乎是一个糟糕的解决方案

如果它是一个web应用程序,我会为Switch元素添加额外的属性,比如:

<Switch data-type="user-involvement" data-uid="10" .../>

数据类型为“用户参与”的所有元素的集合绑定更改

在{N}内核中有没有类似的方法?

  • 如果您使用的是{N}核心风味,那么您应该能够添加
    checkedChange
    在加载
    开关的
    事件时侦听器

  • Switch
    checkedChange
    事件中,您可以通过更新与之绑定的可观察属性来更新其他
    Switch
    checked
    属性


    • 我为您创建了一个示例游乐场。在初始加载时,在youe XML中,可以有2个开关,并且可以根据第一个开关的状态控制第二个开关

        <Switch checked="{{involved}}" loaded="switchLoaded" />
        <Switch checked="{{assigned}}" isEnabled="{{involved}}" />
      
      还可以在加载的方法上绑定侦听器

      function switchLoaded(args) {
        console.log(args.object.bindingContext);
        args.object.on("checkedChange", (args) => {
          console.log("checkedChange ", args.object.checked);
        });
      }
      

      在args.object.bindingContext中,您可以访问您可以控制的数据。

      静态开关元素的绑定不是挑战,它是绑定checkedChange到动态元素列表(其中id绑定对我来说似乎不是一个好的解决方案)…请参阅我在原始问题中添加的额外说明。正如我在回答中已经提到的,使用Switch本身的加载事件而不是页面,这样您可以执行类似于
      args.object.on('checkedChange',listener')的操作。谢谢,我还没有试过,但这正是我要找的!很好,我还为游乐场示例添加了一个链接,您可以使用。你可以对答案进行投票,这样有类似问题的人就可以从中受益。顺便问一下,你知道当开关被改变时,如何改变可以观察到的视图模型吗?也就是说,如果涉及的开关变为false,则为该用户分配的值也应变为false。。。我尝试过类似这样的方法
      homeViewModel.forEach(函数(e,I){if(args.object.bindingContext.name==e.name){homeViewModel.set(“homeViewModel[“+I+”]['assigned']],true);})…但没有更改。。。
      
      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);
        });
      }