首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Nativescript Pro UI - DataForm

Nativescript Pro UI - DataForm
EN

Stack Overflow用户
提问于 2016-10-27 02:17:31
回答 1查看 684关注 0票数 1

我正在为{N}使用Telerik组件(没有支持),并且DataForm有一些问题。

当我将一个对象传递给页面上下文时,所有使用Picker编辑器的字段都不能选择正确的值。

我将展示我所写的代码:

teste-model.js

代码语言:javascript
复制
var Value = (function() {
    function Value(text, value) {
        this.text  = text;
        this.value = value;
    }
    return Value;
})();

var ValueModel = (function() {
    function ValueModel() {}

    Object.defineProperty(ValueModel.prototype, "model", {
        get: function () {
            if (!this._model) {
                this._model = new Value("This is a text", "VALUE 1");
            }
            return this._model;
        },
        enumerable: true,
        configurable: true
    });
    return ValueModel;

})();

exports.Value = Value;
exports.ValueModel = ValueModel;

teste.js

代码语言:javascript
复制
var ValueModel = require("./teste-model").ValueModel;

var page;

exports.onPageLoaded = function(args) {
    console.log("Carregando página...");
    page = args.object;
    page.bindingContext = new ValueModel();

    console.log(JSON.stringify(page.bindingContext));
}

teste.xml

代码语言:javascript
复制
<Page loaded="onPageLoaded"
    xmlns:df="nativescript-telerik-ui-pro/dataform">

    <StackLayout>
        <df:RadDataForm id="myDataForm" source="{{ model }}">
            <df:RadDataForm.properties>
                <df:EntityProperty name="text" displayName="Text" index="0" />
                <df:EntityProperty name="value" displayName="Value" index="1" valuesProvider="VALUE 0, VALUE 1, VALUE 2">
                    <df:EntityProperty.editor>
                        <df:PropertyEditor type="Picker" />
                    </df:EntityProperty.editor>
                </df:EntityProperty>
            </df:RadDataForm.properties>
        </df:RadDataForm>
    </StackLayout>

</Page>

字段值应该显示“值1”,但显示“值0":

有什么解决办法吗?

更新

我已经做了Vladimir建议的更改,但是选择符属性仍然没有反映对象的更改。

我还添加了一个按钮到页面,用随机值填充数据表单。text属性通常会侦听更改,但选择器属性不会。

如果选择一个选择值并单击该按钮,则该属性将重置为第一个提供程序值。

实际代码是:

teste.xml

代码语言:javascript
复制
<Page loaded="onPageLoaded"
    xmlns:df="nativescript-telerik-ui-pro/dataform">

    <StackLayout>
        <df:RadDataForm id="myDataForm" source="{{ model }}">
            <df:RadDataForm.properties>
                <df:EntityProperty name="text" displayName="Text" index="0" />
                <df:EntityProperty name="value" displayName="Value" index="1" valuesProvider="VALUE 0, VALUE 1, VALUE 2">
                    <df:EntityProperty.editor>
                        <df:PropertyEditor type="Picker" />
                    </df:EntityProperty.editor>
                </df:EntityProperty>
            </df:RadDataForm.properties>
        </df:RadDataForm>
        <Button text="change" tap="changeModel" />
    </StackLayout>

</Page>

teste.js

代码语言:javascript
复制
exports.onPageLoaded = function(args) {
    console.log("Carregando página...");
    page = args.object;
    page.bindingContext = new ValueModel();
}

exports.changeModel = function(args) {

    var arr = ["VALUE 0", "VALUE 1", "VALUE 2"];

    page.bindingContext.set("model", new Value(
                Math.random(10000, 99999).toString()
                , arr[Math.floor(Math.random() * arr.length)]
                )
            );
    console.log(JSON.stringify(page.bindingContext.model));
}

teste-model.js

代码语言:javascript
复制
var Observable = require("data/observable").Observable;

var Value = (function() {
    function Value(text, value) {
        this.text  = text;
        this.value = value;
    }
    return Value;
})();

var ValueModel = (function(_super) {
    __extends(ValueModel, _super);

    function ValueModel() {
        _super.call(this);
        this.model  = new Value("This is a texte","VALUE 1");
    }

    Object.defineProperty(ValueModel.prototype, "model", {
        get: function () {
            return this.get("_model");
        },
        set: function(_model) {
            this.set("_model", _model);
        },
        enumerable: true,
        configurable: true
    });
    return ValueModel;

})(Observable);

exports.Value = Value;
exports.ValueModel = ValueModel;
EN

回答 1

Stack Overflow用户

发布于 2016-10-27 08:35:38

看起来,您正在对一个简单的JavaScript对象( model)进行运行时更改,这就是为什么这些更改没有反映在RadDataForm中。当所需的行为能够在运行时更改某些对象属性时,您可以使用位于Observabledata/observable模块的{N} tns-core-modules。然后,让ValueModel扩展它并更改模型属性的签名,如下所示:

代码语言:javascript
复制
var observable_1 = require("data/observable");
var ValueModel = (function (_super) {
    __extends(ValueModel, _super);
    function ValueModel() {
        _super.call(this);
        this.model = new Value("This is a text", "INITIAL VALUE 0");
        this.model.value = "VALUE 1";
    }
    Object.defineProperty(PersonViewModel.prototype, "model", {
        get: function () {
            return this.get("_model");
        },
        set: function (value) {
            this.set("_model", value);
        },
        enumerable: true,
        configurable: true
    });
    return PersonViewModel;
}(observable_1.Observable));

您还可以查看nativescript样例TypeScript变体存储库的主分支中的GitHub,该存储库已被更改以说明此场景。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40275063

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档