2015-08-08 86 views
0

在我的NativeScript应用程序中有一个ListView。我想绑定一个Observable对象数组来修改每个项目。然而NativeScript似乎在同一个项目(绑定数组的最后一个项目)绑定为每个ListView项ListView中的可观察元素不正确地绑定元素

这是我的布局:

<Page loaded="onPageLoaded"> 
    <StackLayout orientation="vertical"> 
      <ListView items="{{items}}"> 
        <ListView.itemTemplate> 
          <Label text="{{name}}" /> 
        </ListView.itemTemplate> 
      </ListView> 
    </StackLayout> 
</Page> 

视图模型是这样的:

var observableModule = require("data/observable"); 
var observableArray = require("data/observable-array"); 
var viewModule = require("ui/core/view"); 

var items = [ 
    new observableModule.Observable({name:"Item 1"}), 
    new observableModule.Observable({name:"Item 2"}) 
]; 

var pageData = new observableModule.Observable(); 
var page; 

exports.onPageLoaded = function(args) { 
    page = args.object; 
    pageData.set("items",items); 
    page.bindingContext = pageData; 
}; 

我期望ListView显示“Item 1”和“Item 2”,但它显示“Item 2”,“Item 2”。你可以看到在这张截图的问题:

Screenshot of the problem

目前的目标就是Android的方式。

回答

2

问题在于NativeScript的Observable类定义属性的方式(它们引用保存在闭包中的'this'的副本,并重新定义构造函数中的属性,因此它们最终都引用最后一个对象的值)。在data/observable/observable.ts(已安装版本中的data/observable/observable.js)中,对that的引用应更改为this。随着更改,我创建了一个pull request

+0

优秀的职位!相反,只需使用新的Observable()实例化Observable,然后为每个属性添加 .set(“my_property”,my_value)即可​​。 – Avrohom

+0

运行Nativescript项目的特别有用的人改进了我的pull请求,并将更改合并为主分支,作为新的请求[#927](https://github.com/NativeScript/NativeScript/pull/927) –

1

请试试这个代码:

var items = new observableArray.ObservableArray([]); 
var pageData = new observableModule.Observable(); 
var page; 

exports.onPageLoaded = function(args) { 
    page = args.object; 
    items.push({name:"Item 1"}); 
    items.push({name:"Item 2"}); 
    pageData.set("items",items); 
    page.bindingContext = pageData; 
}; 

按我的知识observableArray扩展类的可观察,所以你并不需要在创建可观察到的阵列来创建新的观察对象。

+0

虽然我仍然不知道为什么我原来的代码不起作用,我可以接受这个解决方案。这对我来说只是一个错误,但我刚开始使用NativeScript,所以我不确定 –

+0

我不确定这个解决方案是否是我正在寻找的。如果我更改列表项并添加一个新项('items.setItem(1,{name:“new item”})'),UI将被更新。如果我只是修改一个现有的项目('var a = items.getItem(1); a.name =“changed item”; items.setItem(1,a);')UI不会更改 –

+0

假设'items'是绑定到RadListView,并且pageData中还有另一个对象。在这种情况下,我如何访问RadListview内的其他对象? –