NativeScript viewModel可以具有“计算”属性吗?

时间:2018-11-25 13:09:19

标签: javascript mvvm knockout.js observable nativescript

说我有一个简单的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 :(得分:0)

NativeScript Core的重量很轻,没有像开箱即用的计算功能那样精美的功能。但是有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;

Here is a playground sample

如果您希望使用方便的语法来查找计算,动态模板等高级功能,我建议迁移到Angular / Vue。我还没有使用过Knockout,但是我想它可以与NativeScript集成在一起,就像今天Angular / Vue一样,可以花点力气-一天结束时,所有内容都只是JavaScript;)