Событие между пользовательским компонентом и страницей в Nativescript - PullRequest
0 голосов
/ 20 марта 2020

В моем приложении NativeScript (JS / Core) у меня есть пользовательский компонент с кнопкой внутри:

mycomp. xml

<!-- mycomp.xml -->
<StackLayout loaded="onLoaded">
  <Button text="{{ label }}" tap="onTap" />
  ...
</StackLayout>

mycomp. js

/* mycomp.js */
function onLoaded(args) {
    const obj = args.object;
    obj.bindingContext = {
        label: obj.label
    };
}

function onTap(args) {
    console.log('comp button tap'); // fired
}

стр. xml

<!-- page.xml -->
<Page xmlns:mycomp="components/mycomp" xmlns="http://schemas.nativescript.org/tns.xsd">
...
<mycomp:mycomp label="Test" tap="onButtonTap" />
...
</Page>

стр. js

/* page.js */
exports.onButtonTap = function(args) {
  console.log('Button Tap'); // not fired
}

Как передать событие касания внутри компонента событию страницы "onButtonTap"?

1 Ответ

0 голосов
/ 20 марта 2020

Поскольку я хотел использовать свой компонент несколько раз на разных страницах, я разработал это решение с помощью комментариев здесь.

// home-view-model.js
const fromObject = require("tns-core-modules/data/observable").fromObject;
function createViewModel() {
    var viewModel = fromObject({
        compdata: {
            foo: "bar",
            ontap: function(args) {
                console.log('button tap');
            }
        }
    });

    return viewModel;
}

exports.createViewModel = createViewModel;
<!-- home-page.xml -->
<Page xmlns:mycomp="components/mycomp" xmlns="http://schemas.nativescript.org/tns.xsd">
...
<mycomp:mycomp compdata="compdata" />
...
</Page>
// mycomp.js
const fromObject = require("tns-core-modules/data/observable").fromObject;
function onLoaded(args) {
    const obj = args.object;
    obj.bindingContext = fromObject(obj.compdata);
}
<!-- mycomp.xml -->
<StackLayout loaded="onLoaded">
  <Button text="{{ foo }}" tap="{{ ontap }}" />
  ...
</StackLayout>
...