【问题标题】:How do I use a converter in NativeScript?如何在 NativeScript 中使用转换器?
【发布时间】:2017-12-05 19:06:50
【问题描述】:

我正在尝试在 {N} 中使用一个简单的转换器。到目前为止,我已经阅读了https://docs.nativescript.org/core-concepts/data-binding#using-converters-in-bindings 的文档大约 14 次,但我不理解这个概念,因为文档似乎非常模糊。他们使用了一个半成品的 dateConverter 示例,而且他们确实......

source.set("dateConverter", dateConverter);
source.set("testDate", new Date());
page.bindingContext = source;

...没有解释“来源”来自哪里或他们如何设置它?另外,我已经分配了page.bindingContext,所以我不知道如何将它与文档中提供的示例联系起来。

这是我的 XML 文件:

<page navigatingTo="onNavigatingTo" backgroundColor="orange">
    <action-bar title="{{ name, name | uppercase }}" class="action-bar" />

    <stack-layout orientation="vertical" verticalAlignment="center">
        <label text="Welcome to Page-B" textAlignment="center" />
    </stack-layout>
</page>

我希望 actionBar 的标题大写,所以我添加了一个 uppercase 转换器(或至少尝试这样做)。下面是对应的js文件:

exports.onNavigatingTo = function(args) {
    var page = args.object;
    page.bindingContext = page.navigationContext;

    var uppercase = {
        toView: function(value) {
            console.log(`value: ${value}`);
            return value.toUpperCase();
        }
    }
}

我收到错误:找不到函数或过滤器:大写

我知道我在某处缺少某种绑定,将转换器绑定到其他东西,但我不知道该怎么做。任何人都可以提供一个基于此的小例子吗?

我已经看到了类似的问题Using nativescript converters,但这并没有帮助,因为我也没有使用 Angular(只是普通的 NativeScript/JS),而且该帖子也没有有意义的结论性答案。

【问题讨论】:

    标签: converter nativescript


    【解决方案1】:

    uppercase 方法应该是您的视图模型的一部分,因为您将它绑定到您的 XML 中。关于普通 JS 和/或 TypeScript 项目中的转换器的详细文章部分可以找到here

    例如

    var uppercase = {
        toView: function(value) {
            console.log(`value: ${value}`);
            return value.toUpperCase();
        }
    }
    
    
    myViewModel.set("uppercase", uppercase); // e.g. myViewModel === new Observable();
    
    page.bindingContext = myViewModel;
    

    【讨论】:

    • 抱歉,这没有帮助。首先,我已经指出了与您相同的文档链接。其次,您的代码示例给出了以下错误:myViewModel.set is not a function
    • 视图模型应该是 Observable 类型,所以你会有'set' - 我猜你正在通过导航上下文传递普通对象 - 只需创建新的 Observable 视图模型,你就会有set 函数。实际上,示例中的“源”是模板 Hello World 应用程序 (tns create myApp) 中的 Observable 类型 - 将此用作参考 github.com/NativeScript/template-hello-world/blob/master/…
    【解决方案2】:

    好的,我发现尼克的回答有什么问题,基于此,此代码有效:

    exports.onNavigatingTo = function(args) {
        var page = args.object;
    
        var uppercase = {
            toView: function(value) {
                console.log(`value: ${value}`);
                return value.toUpperCase();
            }
        }
    
        var myViewModel = page.navigationContext;
        myViewModel.uppercase = uppercase;
        page.bindingContext = myViewModel;
    }
    

    【讨论】:

    • 似是而非的解决方案,但请记住,使用这种方法,您不会创建可观察的视图模型,而是传递具有名为uppercase 的属性的普通对象。不利的一面是,与 Observable 视图模型相比,这种方式不会进行更改检测。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-29
    • 2020-05-13
    • 1970-01-01
    • 1970-01-01
    • 2021-05-16
    • 1970-01-01
    • 2018-08-19
    相关资源
    最近更新 更多