mirror of
https://github.com/NativeScript/NativeScript.git
synced 2025-08-17 04:41:36 +08:00
data binding
This commit is contained in:
@ -61,6 +61,7 @@
|
|||||||
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
|
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
|
||||||
<Import Project="$(VSToolsPath)\WebApplications\Microsoft.WebApplication.targets" Condition="'$(VSToolsPath)' != ''" />
|
<Import Project="$(VSToolsPath)\WebApplications\Microsoft.WebApplication.targets" Condition="'$(VSToolsPath)' != ''" />
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<TypeScriptCompile Include="apps\action-bar-demo\pages\data-binding.ts" />
|
||||||
<TypeScriptCompile Include="apps\cuteness.unoptimized\app.ts" />
|
<TypeScriptCompile Include="apps\cuteness.unoptimized\app.ts" />
|
||||||
<TypeScriptCompile Include="apps\cuteness.unoptimized\details-page.ts">
|
<TypeScriptCompile Include="apps\cuteness.unoptimized\details-page.ts">
|
||||||
<DependentUpon>details-page.xml</DependentUpon>
|
<DependentUpon>details-page.xml</DependentUpon>
|
||||||
@ -69,6 +70,7 @@
|
|||||||
<DependentUpon>main-page.xml</DependentUpon>
|
<DependentUpon>main-page.xml</DependentUpon>
|
||||||
</TypeScriptCompile>
|
</TypeScriptCompile>
|
||||||
<TypeScriptCompile Include="apps\cuteness.unoptimized\reddit-app-view-model.ts" />
|
<TypeScriptCompile Include="apps\cuteness.unoptimized\reddit-app-view-model.ts" />
|
||||||
|
<Content Include="apps\action-bar-demo\pages\data-binding.xml" />
|
||||||
<Content Include="apps\cuteness.unoptimized\reddit-item-view-model.ts" />
|
<Content Include="apps\cuteness.unoptimized\reddit-item-view-model.ts" />
|
||||||
<TypeScriptCompile Include="apps\cuteness.unoptimized\reddit-model.d.ts" />
|
<TypeScriptCompile Include="apps\cuteness.unoptimized\reddit-model.d.ts" />
|
||||||
<TypeScriptCompile Include="apps\action-bar-demo\app.ts" />
|
<TypeScriptCompile Include="apps\action-bar-demo\app.ts" />
|
||||||
|
@ -6,6 +6,7 @@
|
|||||||
<Button tap="itemTap" text="navigation button" tag="navigation-button" />
|
<Button tap="itemTap" text="navigation button" tag="navigation-button" />
|
||||||
<Button tap="itemTap" text="action items icons" tag="action-items-icon" />
|
<Button tap="itemTap" text="action items icons" tag="action-items-icon" />
|
||||||
<Button tap="itemTap" text="action items text" tag="action-items-text" />
|
<Button tap="itemTap" text="action items text" tag="action-items-text" />
|
||||||
|
<Button tap="itemTap" text="data binding" tag="data-binding" />
|
||||||
</StackLayout>
|
</StackLayout>
|
||||||
</ScrollView>
|
</ScrollView>
|
||||||
</Page>
|
</Page>
|
58
apps/action-bar-demo/pages/data-binding.ts
Normal file
58
apps/action-bar-demo/pages/data-binding.ts
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
import observable = require("data/observable");
|
||||||
|
import view = require("ui/core/view");
|
||||||
|
import pages = require("ui/page");
|
||||||
|
|
||||||
|
export function pageLoaded(args) {
|
||||||
|
var page = <pages.Page>args.object;
|
||||||
|
var vm = new observable.Observable();
|
||||||
|
vm.set("title", "title");
|
||||||
|
vm.set("navText", "navText");
|
||||||
|
vm.set("firstItemText", "txt");
|
||||||
|
vm.set("secondItemIcon", "res://ic_test");
|
||||||
|
vm.set("mainIcon", "res://ic_test");
|
||||||
|
vm.set("navIcon", "res://ic_test");
|
||||||
|
vm.set("firstItemTap", function () {
|
||||||
|
console.log("firstItemTap");
|
||||||
|
});
|
||||||
|
vm.set("secondItemTap", function () {
|
||||||
|
console.log("secondItemTap");
|
||||||
|
});
|
||||||
|
vm.set("navTap", function () {
|
||||||
|
console.log("navTap");
|
||||||
|
});
|
||||||
|
page.bindingContext = vm;
|
||||||
|
}
|
||||||
|
var i = 0;
|
||||||
|
export function buttonTap(args) {
|
||||||
|
var page = <pages.Page>view.getAncestor(<view.View>args.object, "Page")
|
||||||
|
var vm = page.bindingContext;
|
||||||
|
var icon;
|
||||||
|
if (i % 3 === 0) {
|
||||||
|
icon = "res://ic_test";
|
||||||
|
}
|
||||||
|
else if (i % 3 === 1) {
|
||||||
|
icon = "~/action-bar-demo/test-icon.png";
|
||||||
|
}
|
||||||
|
else if (i % 3 === 2) {
|
||||||
|
icon = undefined;
|
||||||
|
}
|
||||||
|
vm.set("title", "title " + i);
|
||||||
|
vm.set("navText", "navText " + i);
|
||||||
|
vm.set("firstItemText", "txt " + i);
|
||||||
|
vm.set("secondItemIcon", icon);
|
||||||
|
vm.set("mainIcon", icon);
|
||||||
|
vm.set("navIcon", icon);
|
||||||
|
vm.set("firstItemTap", function () {
|
||||||
|
var j = i;
|
||||||
|
console.log("firstItemTap " + j);
|
||||||
|
});
|
||||||
|
vm.set("secondItemTap", function () {
|
||||||
|
var j = i;
|
||||||
|
console.log("secondItemTap " + j);
|
||||||
|
});
|
||||||
|
vm.set("navTap", function () {
|
||||||
|
var j = i;
|
||||||
|
console.log("navTap " + j);
|
||||||
|
});
|
||||||
|
i++;
|
||||||
|
}
|
14
apps/action-bar-demo/pages/data-binding.xml
Normal file
14
apps/action-bar-demo/pages/data-binding.xml
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
<Page loaded="pageLoaded">
|
||||||
|
<Page.actionBar>
|
||||||
|
<ActionBar title="{{ title }}" icon="{{ mainIcon }}">
|
||||||
|
<NavigationButton text="{{ navText }}" icon="{{ navIcon }}" tap="{{ navTap }}"/>
|
||||||
|
<ActionBar.actionItems>
|
||||||
|
<ActionItem text="{{ firstItemText }}" tap="{{ firstItemTap }}" iosPosition="left"/>
|
||||||
|
<ActionItem icon="{{ secondItemIcon }}" tap="{{ secondItemTap }}" iosPosition="right"/>
|
||||||
|
</ActionBar.actionItems>
|
||||||
|
</ActionBar>
|
||||||
|
</Page.actionBar>
|
||||||
|
<StackLayout>
|
||||||
|
<Button text="button" tap="buttonTap"/>
|
||||||
|
</StackLayout>
|
||||||
|
</Page>
|
@ -35,4 +35,3 @@ export function visibilityTap(args: observable.EventData) {
|
|||||||
j++;
|
j++;
|
||||||
console.log("Visibility changed to: " + page.actionBar.androidIconVisibility);
|
console.log("Visibility changed to: " + page.actionBar.androidIconVisibility);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -57,13 +57,13 @@ export class ActionBar extends bindable.Bindable implements dts.ActionBar {
|
|||||||
set navigationButton(value: NavigationButton) {
|
set navigationButton(value: NavigationButton) {
|
||||||
if (this._navigationButton !== value) {
|
if (this._navigationButton !== value) {
|
||||||
if (this._navigationButton) {
|
if (this._navigationButton) {
|
||||||
detachActionItem(this._navigationButton);
|
this._navigationButton.actionBar = undefined;
|
||||||
}
|
}
|
||||||
|
|
||||||
this._navigationButton = value;
|
this._navigationButton = value;
|
||||||
|
|
||||||
if (this._navigationButton) {
|
if (this._navigationButton) {
|
||||||
attachActionItem(this._navigationButton, this);
|
this._navigationButton.actionBar = this;
|
||||||
}
|
}
|
||||||
|
|
||||||
this.updateActionBar();
|
this.updateActionBar();
|
||||||
@ -130,6 +130,15 @@ export class ActionBar extends bindable.Bindable implements dts.ActionBar {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public _onBindingContextChanged(oldValue: any, newValue: any) {
|
||||||
|
super._onBindingContextChanged(oldValue, newValue);
|
||||||
|
if (this._navigationButton) {
|
||||||
|
this._navigationButton.bindingContext = newValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
this._actionItems.getItems().forEach((item, i, arr) => { item.bindingContext = newValue; });
|
||||||
|
}
|
||||||
|
|
||||||
public shouldShow(): boolean {
|
public shouldShow(): boolean {
|
||||||
if (this.title ||
|
if (this.title ||
|
||||||
this.icon ||
|
this.icon ||
|
||||||
@ -157,9 +166,7 @@ export class ActionItems implements dts.ActionItems {
|
|||||||
}
|
}
|
||||||
|
|
||||||
this._items.push(item);
|
this._items.push(item);
|
||||||
|
item.actionBar = this._actionBar;
|
||||||
attachActionItem(item, this._actionBar);
|
|
||||||
|
|
||||||
this.invalidate();
|
this.invalidate();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -173,9 +180,8 @@ export class ActionItems implements dts.ActionItems {
|
|||||||
throw new Error("Cannot find item to remove");
|
throw new Error("Cannot find item to remove");
|
||||||
}
|
}
|
||||||
|
|
||||||
detachActionItem(item);
|
|
||||||
|
|
||||||
this._items.splice(itemIndex, 1);
|
this._items.splice(itemIndex, 1);
|
||||||
|
item.actionBar = undefined;
|
||||||
this.invalidate();
|
this.invalidate();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -271,16 +277,3 @@ export class ActionItem extends ActionItemBase {
|
|||||||
export class NavigationButton extends ActionItemBase {
|
export class NavigationButton extends ActionItemBase {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function attachActionItem(item: ActionItemBase, bar: ActionBar) {
|
|
||||||
item.actionBar = this._actionBar;
|
|
||||||
item.bind({
|
|
||||||
sourceProperty: "bindingContext",
|
|
||||||
targetProperty: "bindingContext"
|
|
||||||
}, this._actionBar);
|
|
||||||
}
|
|
||||||
|
|
||||||
function detachActionItem(item: ActionItemBase) {
|
|
||||||
item.actionBar = undefined;
|
|
||||||
item.unbind("bindingContext");
|
|
||||||
}
|
|
@ -10,8 +10,6 @@ import actionBar = require("ui/action-bar");
|
|||||||
import dependencyObservable = require("ui/core/dependency-observable");
|
import dependencyObservable = require("ui/core/dependency-observable");
|
||||||
import proxy = require("ui/core/proxy");
|
import proxy = require("ui/core/proxy");
|
||||||
|
|
||||||
var OPTIONS_MENU = "optionsMenu";
|
|
||||||
|
|
||||||
var navigationBarHiddenProperty = new dependencyObservable.Property(
|
var navigationBarHiddenProperty = new dependencyObservable.Property(
|
||||||
"navigationBarHidden",
|
"navigationBarHidden",
|
||||||
"Page",
|
"Page",
|
||||||
|
Reference in New Issue
Block a user