需要帮助了解此 TODO 提供程序

Posted

技术标签:

【中文标题】需要帮助了解此 TODO 提供程序【英文标题】:Need help understanding this TODO provider 【发布时间】:2018-08-28 18:56:55 【问题描述】:

我刚刚从网上下载了一个Ionic 项目。

在文件上:src/pages/home/home.ts 我有以下代码片段:

...
addTodo() 
    let prompt = this.alertCtrl.create(
        title: 'Add Todo',
        message: 'Describe your todo below:',
        inputs: [
            
                name: 'title'
            
        ],
        buttons: [
            
                text: 'Cancel'
            ,
            
                text: 'Save',
                handler: todo => 
                    if (todo) 
                        this.showLoader();
                        this.todoService.createTodo(todo).then(
                            result => 
                                this.loading.dismiss();
                                this.todos = result;
                                console.log("todo created");
                            ,
                            err => 
                                this.loading.dismiss();
                                console.log("not allowed");
                            
                        );
                    
                
            
        ]
    );
    prompt.present();

...

在文件上:src/providers/todos.ts 我有以下代码片段:

...
createTodo(todo) 
    return new Promise((resolve, reject) => 
        let headers = new Headers();
        headers.append('Content-Type', 'application/json');
        headers.append('Authorization', this.authService.token);
        this.http
            .post(
                'http://127.0.0.1:8080/api/todos',
                JSON.stringify(todo),
                 headers: headers 
            )
            .map(res => res.json())
            .subscribe(
                res => 
                    resolve(res);
                ,
                err => 
                    reject(err);
                
            );
    );

...

我的问题是:

在文件上:home.ts 我们有:handler: todo => ... 参数的内容是什么:todo?,它是一个对象吗?它是一个带有待办事项标题的字符串吗?

里面发生了什么……

this.todoService.createTodo(todo)

【问题讨论】:

请在 console.log 中检查 todo... 并更新您的问题.... 【参考方案1】:

当您在表单中按下“保存”按钮时,处理函数将起作用。

所以,保存按钮的目的是在数据库或后端系统上创建新的待办事项。

我在您的代码中添加了 cmets:

buttons: [
            
                text: 'Cancel'
            ,
            
                text: 'Save',
                handler: todo => 
                    if (todo) 
                        this.showLoader(); // <= show loading spinning image maybe
                        this.todoService.createTodo(todo).then( // <= call createTodo of todoService and wait for the server's response.

                        result => 
                            this.loading.dismiss(); // <= loading spinning image close
                            this.todos = result; // <= save server's response ( it would be new todo item info or server's success message. it depends on the api servers defined responses. )
                            console.log("todo created");
                        ,
                        err => 
                            this.loading.dismiss();
                            console.log("not allowed");
                        
                    );

...

而createTodo函数是

createTodo(todo) 
    return new Promise((resolve, reject) => 
        let headers = new Headers(); // <= set header to call post request to the api server.
        headers.append('Content-Type', 'application/json');
        headers.append('Authorization', this.authService.token);
        this.http
            .post(
                'http://127.0.0.1:8080/api/todos',
                JSON.stringify(todo),
                 headers: headers 
            )
            .map(res => res.json())
            .subscribe(   // <= when server success to create new todo item, server will send success response or error messages.
                res => 
                    resolve(res); // <= success case
                ,
                err => 
                    reject(err); // <= error case
                
            );
    );

希望对你有帮助:)

【讨论】:

但是todo 对象是如何创建的?,我在客户端(不是后端)找不到todo 对象的任何架构【参考方案2】:

@davidesp 你的第一个问题是参数的内容是什么:todo?

todo 是一个依赖于inputs 字段的对象,todo 是用户定义的名称,你可以给这个对象的任何名称,不需要像subscribe 那样定义有两个状态一个成功阻止另一个错误block.Here 输入有一个字段 title 所以它在对象中只有一项。

        inputs: [
            
                name: 'title'
            
        ]

请查看link

当您点击Save 按钮时,会发生以下代码(用 cmets 描述)

addTodo() 
    let prompt = this.alertCtrl.create(
        title: 'Add Todo',
        message: 'Describe your todo below:',
        inputs: [
            
                name: 'title'
            
        ],
        buttons: [
            
                text: 'Cancel'
            ,
            
                text: 'Save',
                handler: todo => 
                    if (todo)  //check data avaiable
                        this.showLoader(); //call loader
                        this.todoService.createTodo(todo)//call todoService
                           .then(
                            result =>  //success block todoService
                                this.loading.dismiss(); //loader dismiss call
                                this.todos = result;
                                console.log("todo created");
                            ,
                            err =>  //error block todoService
                                this.loading.dismiss(); //loader dismiss call
                                console.log("not allowed");
                            
                        );
                    
                
            
        ]
    );
    prompt.present();

@davidesp 您的第二个问题是this.todoService.createTodo(todo) 内部发生了什么

createTodo(todo) 
    return new Promise((resolve, reject) => 
        let headers = new Headers(); // server request Headers initilization
        // setting header value ...
        headers.append('Content-Type', 'application/json');
        headers.append('Authorization', this.authService.token);
        // Calling http post method here first parameter is url second data and third is header value ...
        this.http
            .post(
                'http://127.0.0.1:8080/api/todos',
                JSON.stringify(todo),
                 headers: headers 
            )
            //map converting response json value 
            .map(res => res.json())
            .subscribe(
                res =>  //success block 
                    resolve(res); // resolve promise 
                ,
                err =>  //error block 
                    reject(err);// reject promise 
                
            );
    );

【讨论】:

但是todo 对象是如何创建的?,我在客户端(不是后端)找不到todo 对象的任何架构

以上是关于需要帮助了解此 TODO 提供程序的主要内容,如果未能解决你的问题,请参考以下文章

我需要帮助了解扩展初始化程序列表错误吗?

需要帮助了解我的 Android 应用程序中的内存泄漏

需要帮助了解此操作

需要帮助了解此动态编程解决方案

需要帮助了解此Python列表语法

需要帮助了解 flutter_bloc 如何注入 bloc