在Repeater上强制更新阵列

时间:2015-10-12 16:05:55

标签: repeater nativescript

使用XML构建转发器时,如上例所示,如何在以后更新阵列?

        <Repeater items="{{ letras }}" id="rep">
        <Repeater.itemsLayout>
            <StackLayout horizontalAlignment="center" orientation="horizontal" />
        </Repeater.itemsLayout>
        <Repeater.itemTemplate>
            <Button text="{{ l }}" cssClass="palavraPrincipal" />
        </Repeater.itemTemplate>
        </Repeater>

我知道如果我在Javascript文件上创建转发器,但是在预先制作的XML转发器上有一种方法可以做到这一点吗?

2 个答案:

答案 0 :(得分:1)

要在viewmodel(示例中为letras数组)中进行更改,请在UI中反映出您需要使用Native Script's data binding

以下是一个示例,鉴于您的帖子中的XML视图,它将:

  1. 需要2个模块,可观察(对于可观察的对象)和observable-array(对于数组)。
  2. 创建一个viewmodel,它是保存数据的对象
  3. 将viewmodel绑定到页面的绑定上下文。
  4. 每1秒钟,向viewmodel添加一个新项目(将反映到UI)。
  5. 我将页面的绑定上下文设置为viewmodel。没有必要在Repeater元素上设置绑定上下文,就像calebeaires在他的示例中那样,因为Repeater将查看页面的绑定上下文。

    但是,如果您愿意,可以使用例如2个不同的绑定上下文,1表示页面,1表示Repeater元素。只需替换

    page.bindingContext = viewModel;
    

    page.getViewById('rep').bindingContext = viewModel;
    

    完整代码:

    var observableModule = require("data/observable");
    var observableArrayModule = require("data/observable-array");
    
    var viewModel = new observableModule.Observable({
        letras: new observableArrayModule.ObservableArray([
            { l: 'First' },
            { l: 'Second' },
            { l: 'Third' },
        ])
    });
    
    function pageLoaded(args) {
        var page = args.object;
        page.bindingContext = viewModel;
        //page.getViewById('rep').bindingContext = viewModel;
    
        // Add a new item every 1 second.
        setInterval(function() {
            viewModel.letras.push({
                l: 'New item'
            });
        }, 1000);
    }
    exports.pageLoaded = pageLoaded;
    

答案 1 :(得分:-1)

了解:

一个。声明和变量:

var repeater;

B中。向转发器声明一个ID:

<Repeater items="{{ items }}" id="rep">
 <Repeater.itemTemplate>
     <Button text="{{ $value }}" />
 </Repeater.itemTemplate> 
</Repeater>

℃。在页面加载时重新声明它:

function pageLoaded(args) {
    var page = args.object;
    repeater = view.getViewById(page, "rep");
    page.bindingContext = jogo;
}