【发布时间】:2016-07-11 07:11:38
【问题描述】:
我想从 NativeScript 项目中的自定义组件公开一个方法。这是概念设置:
MyComponent.xml
<StackLayout loaded="loaded"> ...UI markup... </StackLayout>
MyComponent.ts
export function loaded(args) { //do stuff };
export function myCustomMethod() { //do more stuff };
MyPage.xml
<Page xmlns:widget="..." loaded="loaded">
<widget:MyComponent id="myComponent" />
</Page>
MyPage.ts
export function loaded(args) {
let page = <Page>args.object;
let widget = page.getViewById("myComponent");
widget.myCustomMethod(); //<--THIS DOES NOT WORK
}
问题:如何在自定义组件上正确暴露myCustomMethod,以便托管页面可以通过JavaScript访问和调用它?
默认情况下,当尝试在页面上获取对自定义组件的引用时,会返回对自定义组件布局容器的引用(在本例中为StackLayout)。
因此,作为一种解决方法,我正在这样做:
MyComponent.ts
export function loaded(args) {
let stackLayout = <StackLayout>args.object; //Layout container
stackLayout.myCustomMethod = myCustomMethod; //Attach custom method to StackLayout
}
这有点小技巧,但它确实有效。除了为布局容器创建超类之外,有没有更好的方法来公开自定义组件方法?
更新
更准确地说,自定义组件具有实例属性,因此最终的解决方案需要支持...
MyComponent.ts
let isStarted = false;
export function loaded(args){ // do stuff };
export function myCustomMethod() { isStarted = true; };
【问题讨论】:
-
连我都对这个感兴趣
-
托德现在有什么解决方案吗?
-
切换到 TypeScript 让这个问题更自然/更容易解决。如果我今天有一个“可视”自定义组件,我通常会扩展一个 StackLayout,然后添加我的新公共方法/属性。所以我的主要建议是开始使用带有 NativeScript 的 TypeScript(如果你还没有的话)。
标签: nativescript