【问题标题】:Nativescript Pass data to viewNativescript 传数据查看
【发布时间】:2016-10-13 20:52:07
【问题描述】:

我在开发 nativescript android 应用程序时遇到问题。我正在尝试发送一个 POST 请求,并且我正在尝试从该请求中获得响应。使用此响应我正在尝试填充 ListView。我已经成功发送了发布请求并得到了服务器的响应。但问题是我无法填充列表视图。这是我的代码-

Register.xml

   <Page loaded="loaded">
    <StackLayout>
        <Image src="res://logo" stretch="none" horizontalAlignment="center"/>

        <TextField text="{{ name }}" id="name" hint="Name"  />

        <TextField text="{{ email }}" id="email" hint="E-mail"  />

        <TextField text="{{ password }}" secure="true" hint="Password" />

        <Button text="Sign Up" tap="register" />
    </StackLayout>
</Page>

Register.js

var dialogsModule = require("ui/dialogs");
var frameModule = require("ui/frame");

var UserViewModel = require("../../shared/view-models/user-view-model");
var user = new UserViewModel();

exports.loaded = function(args) {
    var page = args.object;
    page.bindingContext = user;
};

function completeRegistration() {
    user.register()
        .then(function() {
            dialogsModule
                .alert("Your account was successfully created.")
                .then(function() {
                    frameModule.topmost().navigate("views/list/list");
                });
        }).catch(function(error) {
            console.log(error);
            dialogsModule
                .alert({
                    message: "Unfortunately we were unable to create your account.",
                    okButtonText: "OK"
                });
        });
}

exports.register = function() {
    completeRegistration();
};

用户视图 model.js

function User(info) {
    info = info || {};


    var viewModel = new Observable({
        name: info.name || "",
        email:info.email || "",
        password: info.password || "",
    });

    viewModel.register = function() {



    return fetchModule.fetch("http://10.0.2.2:8000/user_signup", {
    method: "POST",
    headers: { "Content-Type": "application/json" },
    body: JSON.stringify({ 

           name: viewModel.get("name"),
           email:viewModel.get("email"),
           password:viewModel.get("password"),
        }).then(r => { return r.json(); }).then(function (r) {


   for(var i=0;i<r.length;i++){

       var goods={name:r[i].name}
       goodsList.push(goods);


   };
  console.log(goodsList);

}, function (e) {
         console.log("Error occurred " + e);
    });


    };

      return viewModel;
}

function handleErrors(response) {
    if (!response.ok) {
        console.log(JSON.stringify(response));
        throw Error(response.statusText);
    }
    return response;
}


function pageLoaded(args) {
        var page = args.object;
        pageData.set("goodsList", goodsList);

        page.bindingContext = pageData;
    }

module.exports = User;

列表视图

    <Page loaded="pageLoaded">
    <GridLayout>
        <ListView items="{{ goodsList }}">
            <ListView.itemTemplate>
                <Label text="{{ name }}" horizontalAlignment="left" verticalAlignment="center"/>
            </ListView.itemTemplate>
        </ListView>
    </GridLayout>
</Page>

【问题讨论】:

    标签: javascript android arrays nativescript


    【解决方案1】:

    让您的register() 函数返回一个承诺,该承诺会解决来自请求的响应。之后,NavigationEntry 可以在使用 topmost().navigate 时将上下文对象(在本例中为响应)传递给新页面

    User-view model.js:

    viewModel.register = function() {
        return new Promise<any>((resolve, reject) => { 
            fetchModule.fetch("http://10.0.2.2:8000/user_signup", {
            method: "POST",
            headers: { "Content-Type": "application/json" },
            body: JSON.stringify({ 
    
               name: viewModel.get("name"),
               email:viewModel.get("email"),
               password:viewModel.get("password"),
            }).then(r => { return r.json(); }).then(function (r) {
    
    
           for(var i=0;i<r.length;i++){
               var goods={name:r[i].name}
               goodsList.push(goods);
           };
        resolve(goodsList);
    }, function (e) {
            reject(e);
    });
    

    然后在register.js:

    function completeRegistration() {
        user.register()
            .then(function(result) {
                dialogsModule
                    .alert("Your account was successfully created.")
                    .then(function() {
                        frameModule.topmost().navigate({
                            moduleName: "view/list/list",
                            context: {goodsList: result}
                        });
                    });
            }).catch(function(error) {
                console.log(error);
                dialogsModule
                    .alert({
                        message: "Unfortunately we were unable to create your account.",
                        okButtonText: "OK"
                    });
            });
    }
    

    然后在列表页的控制器中:

    function pageLoaded(args) {
        var page = args.object;
        var context = page.navigationContext;
        page.bindingContext = context;
    }
    

    【讨论】:

    • 很抱歉,Dinh Le 先生,但我遇到了错误。解析未定义。
    • 先生。 Dinh Le,现在我没有收到任何错误,但我也无法导航到列表视图。
    • 确保您有正确的控制器与列表视图页面
    • 先生。 Dinh Le,我是 Nativescript 的新手。我不知道 Controller 是什么意思。你能帮帮我吗?是 list.js 吗?
    • 是的,例如您有list.xml,那么控制器将是list.js。以及register.xml 具有控制器register.js。这个想法是当用户点击注册按钮时,它将触发register.js中的一个函数,该函数将调用函数register()(它将向您的后端发送请求并返回一个承诺)。请求完成后,您将使用刚刚获得的响应导航到 list.xml 并将其绑定到 page.bindingContext
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-27
    • 2015-04-10
    • 2017-07-30
    • 2014-08-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多