【问题标题】:Basic blur event in a Telerik Nativescript Mobile AppTelerik Nativescript 移动应用中的基本模糊事件
【发布时间】:2015-08-09 17:46:31
【问题描述】:

我正在使用 Telerik AppBuilder 和 NativeScript 编写一个跨平台的移动应用程序。我想弄清楚如何在 TextField 上获得基本的“blur”或“onTextChanged”事件。我可以弄清楚如何执行诸如“点击”事件之类的事情,但是为什么很难找到某人执行“模糊”或“onTextChanged”的示例?

我试过这个:

var tagField = view.getViewById(page, "tfDescription")
tagField.set("onblur", function(eventData) {
    pageData.set("debug", "blur this field: " + JSON.stringify(eventData));    
});

我还尝试了 xml 中我能想到的所有属性:

<TextField id="tfDescription" blur="blur" onblur="blur" onLoseFocus="blur" focusLost="blur" textChanged="blur" row="2" text="{{ description }}" />

这些都不起作用。有谁知道如何做到这一点?

谢谢

【问题讨论】:

    标签: javascript mobile telerik nativescript


    【解决方案1】:

    据我所知,NativeScript 中没有模糊(类似)事件。但是,您可以在文本更改时做出反应。

    您要做的是利用Data Binding MechanismsObservable Object 在 NativeScript 中。

    简而言之,数据绑定将允许您将用户界面(通常在您的 XML 文件中描述)与您的业务模型/数据对象连接起来。数据绑定可以是“一种方式”,这意味着您在数据对象中所做的任何更改都将反映在 UI 中。它也可以是两种方式,这意味着您在 UI 中所做的任何更改也将反映在您的数据对象中。

    在您的情况下,您需要两种方式绑定,因为您希望 UI(用户输入文本)中发生的任何事情都反映在您的模型中。

    示例

    xml

    假设你有这个 xml:

    <Page xmlns="http://www.nativescript.org/tns.xsd" loaded="pageLoaded">
     <StackLayout>
       <TextField text="{{ description }}" />
     </StackLayout>
    </Page>
    

    js

    为了便于理解,我已内联注释。

    var observable = require("data/observable");
    
    function pageLoaded(args) {
        var page = args.object;
    
        /**
         * Creating a new Observable object.
         */
        var contextObj = new observable.Observable();
    
        /**
         * Setting the property 'description' to 'hi there'.
         * In your XML you'll attach this property to the
         * Text field as such:
         * <TextField text="{{ description }}" />
         * This means that the Text field will, by default
         * be prepopulated with 'Hi there'
         */
        contextObj.set("description", "Hi there");
    
        /**
         * Attaching the observable object to the
         * 'bindingContext' of the page. This is a
         * special property to which you want to attach
         * the object. By default bindings are two way.
         */
        page.bindingContext = contextObj;
    
        /**
         * Event listener.
         * When the user is changing the text in the UI, this gets propagated down
         * to the contextObj which will change. Here we add an event listener for
         * changes and log some information about the change that just happened.
         */
        contextObj.addEventListener(observable.Observable.propertyChangeEvent, function (event) {
            console.log('The object changed!');
            console.log('Event:        ' + event.eventName);
            console.log('propertyName: ' + event.propertyName);
            console.log('New value:     ' + event.value);
            console.log('');
        });
    
     }
     exports.pageLoaded = pageLoaded;
    

    【讨论】:

    • 这是我开始得出的结论。但是,这样做有两个问题。首先,我需要知道文本框何时模糊,因为我希望在发生这种情况时触发某些事件。例如,我想将更改后的文本框的结果保存到云服务中。其次,如果我绑定到文本更改,我再次遇到不知道用户何时完成更改文本的问题。我不希望每个字符都更改...我只想知道他们何时完成更改描述,以便我可以保存结果而无需强迫他们点击“保存”按钮。想法?
    • 您知道为什么我在尝试添加事件侦听器时总是收到此错误吗?我用过你刚才给我的例子,现在也遇到过这个问题:“/app/tns_modules/data/observable/observable.js:32 TypeError: undefined is not an object (evalating 'eventNames.split ')
    • 我可能会在页面 navigatedFrom 上进行更新和/或设置超时并自上次更改后每 X 秒更新一次。但是,如果您熟悉 iOS/Android,您可以自己实现模糊功能,因为您可以直接访问 API。
    • 关于错误,不知道。我会将我的 tns_modules 更新到最前沿,看看错误是否仍然存在。为此,请按照此处的使用最新的 tns_modules 指南:docs.nativescript.org/running-latest
    • “但是,如果您了解 iOS/Android 的使用方式,您可以自己实现模糊功能,因为您可以直接访问 API” - 这太新了。这是我 4 年前参加 Android 平台上的移动开发课程以结束我的硕士学位后第一次涉足移动开发。我曾希望使用 Telerik 作为闯入移动跨平台的一种简单方法,然后在我进行的过程中扩展我的知识。我认为考虑到我目前的技能水平,你的超时想法可能是可行的方法。非常感谢您在这方面的帮助!
    【解决方案2】:

    仅供参考,在 NativeScript 3 中添加了 blur 事件,并且可以与 TextViewTextField 组件一起使用。

    编辑现在还有一个focus 事件即将从this pull request 合并。

    【讨论】:

      【解决方案3】:

      好的,我没有将此标记为正确的解决方案,但如果有人看到它会有所帮助。在 Telerik 中,NativeScript 似乎有一些细微的差别。您将需要学习阅读库文件,例如 tns_modules/data/observable/observable.js,以便自己解决这些问题。例如,要创建属性更改侦听器,您需要使用以下语法:

          pageData.on(observableModule.knownEvents.propertyChange, function(propertyChangeData){
              if (propertyChangeData.propertyName != "debug"){
                  pageData.set("debug", propertyChangeData.propertyName + " has been changed and the new value is: " + propertyChangeData.value);
              }
          });
      

      请注意,您使用“observableModule.knownEvents.propertyChange”而不是“observable.Observable.propertyChangeEvent”。您不必像我所做的那样使用函数“on”而不是“addEventListener”。 “on”函数实际上只是转身并调用“addEventListener”。

      我希望这对那里的人有所帮助。

      【讨论】:

        【解决方案4】:

        在 nativescript 3+ 中,这就是我捕捉模糊事件的方式。

        示例代码在nativescript(核心)中

        example.js

        const view = require("ui/core/view");
        const textFieldModule = require("ui/text-field");
        
        exports.pageLoaded = (args) => {
          let page = args.object;
          let myTextFieldView = view.getViewById(page, "myTextField");
          myTextFieldView.on(textFieldModule.TextField.blurEvent, function(eventData) {
              console.log('blur event triggered');
          }, this);
        }
        

        example.xml

        <Page loaded="pageLoaded">
          ...
          <TextField
            id="myTextField"
            hint="My Text Field"
            text="{{ myTextField }}" />
          ...
        </Page>
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-10-27
          • 2015-02-13
          • 1970-01-01
          • 1970-01-01
          • 2017-03-10
          • 1970-01-01
          相关资源
          最近更新 更多