Может ли NativeScript viewModel иметь «вычисляемые» свойства? - PullRequest
0 голосов
/ 25 ноября 2018

Скажем, у меня была простая viewModel, где свойство foo должно быть таким же, как и любое другое, только то, что оно генерируется / вычисляется со значением другого свойства и обновляется всякий раз, когда обновляется другое:

const observableModule = require("tns-core-modules/data/observable");

function HomeViewModel() {
    const viewModel = observableModule.fromObject({
        name: 'John',
        foo() {
            return 'Hello ' + viewModel.name; //not really what I'm looking for
        }
    });

    return viewModel;
}

Knockout.js имеет эти «вычисляемые» наблюдаемые, которые я считаю очень полезными во многих местах.Вот как это будет выглядеть с Knockout.js:

function HomeViewModel() {
    const viewModel = {
        name: ko.observable('John'),
        foo: ko.pureComputed(() => 'Hello ' + viewModel.name())
    };

    return viewModel;
}

Есть ли что-то похожее в NativeScript?

1 Ответ

0 голосов
/ 25 ноября 2018

Ядро NativeScript имеет очень легкий вес, никаких необычных функций, таких как вычисленные из коробки.Но есть propertyChangeEvent, который вы можете использовать для обновления foo при каждом изменении name.

var observableModule = require("tns-core-modules/data/observable");

function HomeViewModel() {
 var viewModel = observableModule.fromObject({
  name: "John",
  foo: ""
 });
 viewModel.on("propertyChange", function (event) {
  const propertyName = event.propertyName;
  if (propertyName === "name") {
    viewModel.set("foo", "Hello " + event.value);
  }
 });
 // To compute initial value for `foo` 
 viewModel.notifyPropertyChange("name", viewModel.get("name"), viewModel.get("name"));
 return viewModel;
}

module.exports = HomeViewModel;

Вот пример игровой площадки .

Iпредложил бы перейти на Angular / Vue, если вы ищете модные функции, такие как вычисления, динамические шаблоны и т. д., с удобным синтаксисом.Я не использовал Knockout, но, полагаю, его можно интегрировать с NativeScript так же, как сегодня, с Angular / Vue, с некоторыми приличными усилиями - в конце дня все просто JavaScript;)

...