mirror of
https://github.com/NativeScript/NativeScript.git
synced 2025-08-16 11:42:04 +08:00
Merge pull request #434 from NativeScript/nnikolov/ListViewBindingContextIssue
BindingContext set two times on adding item to ListView. Fixed issue #410.
This commit is contained in:
@ -5,6 +5,7 @@ import viewModule = require("ui/core/view");
|
||||
import observable = require("data/observable");
|
||||
import types = require("utils/types");
|
||||
import platform = require("platform");
|
||||
import utils = require("utils/utils");
|
||||
|
||||
// <snippet module="ui/list-view" title="list-view">
|
||||
// # ListView
|
||||
@ -580,6 +581,38 @@ export function test_bindingToParentObjectWithSpacesInIndexer() {
|
||||
helper.buildUIAndRunTest(listView, testAction);
|
||||
}
|
||||
|
||||
export function test_ConverterIsCalledJustOnce_onAddingItemsToListView() {
|
||||
var listView = new listViewModule.ListView();
|
||||
var converterCalledCounter = 0;
|
||||
|
||||
var testConverter = function (value) {
|
||||
converterCalledCounter++;
|
||||
return value;
|
||||
}
|
||||
|
||||
app.resources["testConverter"] = testConverter;
|
||||
|
||||
function testAction(views: Array<viewModule.View>) {
|
||||
var listViewModel = new observable.Observable();
|
||||
listViewModel.set("items", [1, 2, 3]);
|
||||
listView.bindingContext = listViewModel;
|
||||
|
||||
listView.bind({ sourceProperty: "items", targetProperty: "items" });
|
||||
listView.itemTemplate = "<Label id=\"testLabel\" text=\"{{ $value, $value | testConverter }}\" />";
|
||||
|
||||
TKUnit.wait(ASYNC);
|
||||
|
||||
if (utils.ios && utils.ios.MajorVersion < 8) {
|
||||
TKUnit.assertEqual(converterCalledCounter, listViewModel.get("items").length * 2, "Converter should be called once for every item.");
|
||||
}
|
||||
else {
|
||||
TKUnit.assertEqual(converterCalledCounter, listViewModel.get("items").length, "Converter should be called once for every item.");
|
||||
}
|
||||
}
|
||||
|
||||
helper.buildUIAndRunTest(listView, testAction);
|
||||
}
|
||||
|
||||
export function test_no_memory_leak_when_items_is_regular_array() {
|
||||
var createFunc = function (): listViewModule.ListView {
|
||||
var listView = new listViewModule.ListView();
|
||||
|
@ -829,9 +829,7 @@ export class View extends proxy.ProxyObject implements definition.View {
|
||||
* Method is intended to be overridden by inheritors and used as "protected"
|
||||
*/
|
||||
public _addViewCore(view: View) {
|
||||
view._setValue(bindable.Bindable.bindingContextProperty, this.bindingContext, dependencyObservable.ValueSource.Inherited);
|
||||
|
||||
view._inheritProperties(this);
|
||||
this._propagateInheritableProperties(view);
|
||||
|
||||
view.style._inheritStyleProperties();
|
||||
|
||||
@ -845,7 +843,11 @@ export class View extends proxy.ProxyObject implements definition.View {
|
||||
}
|
||||
}
|
||||
|
||||
private _inheritProperties(parentView: View) {
|
||||
public _propagateInheritableProperties(view: View) {
|
||||
view._inheritProperties(this);
|
||||
}
|
||||
|
||||
public _inheritProperties(parentView: View) {
|
||||
var that = this;
|
||||
var inheritablePropertySetCallback = function (property: dependencyObservable.Property) {
|
||||
if (property instanceof styling.Property) {
|
||||
|
2
ui/core/view.d.ts
vendored
2
ui/core/view.d.ts
vendored
@ -409,6 +409,8 @@ declare module "ui/core/view" {
|
||||
isLoaded: boolean;
|
||||
|
||||
_addView(view: View);
|
||||
_propagateInheritableProperties(view: View)
|
||||
_inheritProperties(parentView: View)
|
||||
_removeView(view: View);
|
||||
_context: android.content.Context;
|
||||
|
||||
|
@ -114,6 +114,7 @@ export class ListView extends view.View implements definition.ListView {
|
||||
public _prepareItem(item: view.View, index: number) {
|
||||
if (item) {
|
||||
item.bindingContext = this._getDataItem(index);
|
||||
item._inheritProperties(this);
|
||||
}
|
||||
}
|
||||
|
||||
@ -145,4 +146,8 @@ export class ListView extends view.View implements definition.ListView {
|
||||
private _onItemsChanged(args: observable.EventData) {
|
||||
this.refresh();
|
||||
}
|
||||
|
||||
public _propagateInheritableProperties(view: view.View) {
|
||||
// do not get binding context from parent when adding items, since the binding context of the items will be different.
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user