2015-08-08 89 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內的其他對象? –