在Nativescript布局中

时间:2016-06-07 23:19:08

标签: javascript arrays nativescript

我有一个数组,其中包含从Web服务返回的多个对象数组,我们称之为var groups。在我的视图模型中,它是一个可观察的数组。

var groups = [
              [{year:"1986", key2: "foo2"}, {year:"1986", key2:"blah"}],
              [{year:"1987", key2: "baz"}, {year:"1987", key2:"beek"}],
              [{year:"1988", key2: "baz"}, {year:"1988", key2:"beek"}]
             ]

在我的xml中,我试图将<Repeater>嵌套在<Listview>中,使groups数组中的每个数组都是一个列表项,内部的每个对象都是数组将是转发器项。问题是我不知道如何访问父listview项的索引,以便我可以在转发器中引用正确的数组,我在文档中找不到如何从xml中访问列表索引。有谁知道这是否可能?这是一个xml注释的例子???在中继器迭代器中......我能在那里放置什么?

<Listview items="{{ Groups }}">
    <ListView.itemTemplate>
       /* Some other layout content */
      <Repeater items="{{ Groups[parent.index] ??? }}">
        <Repeater.itemTemplate>
          / * the contents of each groups array should display here */
        </Repeater.itemTemplate>
      </Repeater>
    </ListView.itemTemplate> 
</Listview>

编辑:为了更清楚,我基本上只是想知道如何从转发器item属性访问父列表视图索引。这样我就可以在转发器元素中显示正确的数据。

我正在尝试实现如下所示的单独列表。 groups数组中的每个数组都是一个具有相同日期的数据块。因此列表视图行(日期)基于groups数组中包含的数组数量,每个日期下面的数据部分都是从每个数组中的数据填充的。

I'm trying to achieve a separated list such as this below. Each array in the <code>groups</code> array is a chunk of data with the same date. So the list view rows (dates) are based on the number of arrays contained in the <code>groups</code> array and the data sections below each date are populated from the data within each of those arrays.

2 个答案:

答案 0 :(得分:2)

NativeScript中无法获取item中所选Repeater的索引。但是,一个可能的决定可能是将唯一id设置为Label并将tap连接到它。单击Label之一后,您可以获得其唯一的id。我附加了此选项的示例。

主要-page.xml

<Page xmlns="http://www.nativescript.org/tns.xsd" loaded="onPageLoaded">
        <ListView id="listview" items="{{ myItems }}" itemTap="listViewItemTap">
            <ListView.itemTemplate>
                <StackLayout>

                  <Repeater items="{{ myItem2 }}" >
                    <Repeater.itemsLayout>
                      <WrapLayout />
                    </Repeater.itemsLayout>
                    <Repeater.itemTemplate>
                      <Label text="{{ $value.item }}" id="{{$value.key}}" margin="10" onTap="test"/>
                    </Repeater.itemTemplate>
                  </Repeater>
                </StackLayout>
            </ListView.itemTemplate>
        </ListView>
</Page>

主要-page.js

var observable_array_1 = require("data/observable-array");
function onPageLoaded(args) {
    var page = args.object;
    var array = new observable_array_1.ObservableArray();
    var listView = page.getViewById('listview');
    array.push({ myItem2: [{ item: "test1", key: "1" }, { item: "test1", key: 'j' }, { item: "test1", key: "3" }] });
    array.push({ myItem2: [{ item: "test6", key: "6" }, { item: "test4", key: "4" }, { item: "test5", key: "5" }] });
    page.bindingContext = { myItems: array };

}
exports.onPageLoaded = onPageLoaded;
function listViewItemTap(args) {
    var itemIndex = args.index;
    var object = args.object;
    console.log(itemIndex);
}
exports.listViewItemTap = listViewItemTap;
function test(args) {
    console.log(args.object.get('id'));
}
exports.test = test;

答案 1 :(得分:1)

由于NativeScript确实无法在嵌套转发器内部提供索引,并且基于 Nikolay Tsonev的示例,将锯齿状数组转换为具有JSON对象的数组会更容易。以下是this code使用数组所需执行的操作。

var groups = [
      [{year:"1986", key2: "foo2"}, {year:"1986", key2:"blah"}],
      [{year:"1987", key2: "baz"}, {year:"1987", key2:"beek"}],
      [{year:"1988", key2: "baz"}, {year:"1988", key2:"beek"}]
];

var resultArray = new ObservableArray();

groups.forEach(subgroup => {
    var jsonArg1 = new Object();
    jsonArg1["myItem2"] = subgroup;
    resultArray.push(jsonArg1);
});

但是你还有另一个解决方案 - 你可以通过$ parents [Page] .someDataModel为你的嵌套转发器提供完全不同的绑定源。 例如:

// page.xml
<ListView items="{{ items }}">
    <ListView.itemTemplate>
        <StackLayout>
            <Label text="{{ $value }}" />
            <TextField text="{{ $parents['ListView'].test, $parents['ListView'].test }}" />
        </StackLayout>
    </ListView.itemTemplate>
</ListView>

// page.js
viewModel.set("items", [1, 2, 3]);
viewModel.set("test", "Test for parent binding!");

这也需要您手动将二维数组转换为更合适的形式。有关 $ parents here

的更多信息