首页 文章

NativeScript:UI不会在没有刷新的情况下显示ObservableArray中已删除的项目

提问于
浏览
1

首先,我是NativeScript的新手 . 我在这里找到了一个ToDo列表的教程https://x-team.com/blog/build-simple-todo-list-mobile-application-nativescript/,作为一个小练习,我想为列表中的任务添加一个删除功能 .

这是我的代码:

Tasks.xml

<Page xmlns="http://schemas.nativescript.org/tns.xsd" navigatingTo="onNavigatingTo">  
<Page.actionBar>
    <ActionBar title="Tasks">
        <ActionBar.actionItems>
            <ActionItem text="New" tap="{{ insert }}" ios.position="right" />
            <ActionItem text="Delete" tap="{{ delete }}" ios.position="right" />                
        </ActionBar.actionItems>
    </ActionBar>
</Page.actionBar>
<ListView items="{{ tasks }}"></ListView>

tasks-view-model.js

var Observable = require("data/observable").Observable;
var ObservableArray = require("data/observable-array").ObservableArray;  
var Sqlite = require("nativescript-sqlite");  
var Dialogs = require("ui/dialogs");

function createViewModel(database, listId) {  
    var viewModel = new Observable();
    viewModel.tasks = new ObservableArray([]);
    viewModel.listId = listId;

    viewModel.insert = function() {
        Dialogs.prompt("Task Name", "").then(result => {
            database.execSQL("INSERT INTO tasks (list_id, task_name) VALUES (?, ?)", [this.listId, result.text]).then(id => {
                var _string = "ID: " + id + ", " + result.text;
                this.tasks.push(_string);
            }, error => {
                console.log("INSERT ERROR", error);
            });
        });
    }

    viewModel.select = function() {
        this.tasks = new ObservableArray([]);
        database.all("SELECT id, task_name FROM tasks WHERE list_id = ?", [this.listId]).then(rows => {
            for(var row in rows) {
                var _id = rows[row][0];
                var _item = rows[row][1];
                var _string = "ID: " + _id + ", " + _item;
                this.tasks.push(_string);
            }
        }, error => {
            console.log("SELECT ERROR", error);
        });
    }

    viewModel.delete = function() {
        Dialogs.prompt("Task ID", "").then(result => {
            database.execSQL("DELETE FROM tasks WHERE id = ?", [result.text]).then(id => {
               Dialogs.prompt(id);
            }, error => {
                console.log("DELETE ERROR", error);
            });
        });
    }

    viewModel.select();

    return viewModel;
}

exports.createViewModel = createViewModel;

传递其ID时实际删除该项目工作正常 . 然而,如果没有我手动刷新它,UI不显示此更改,我无法弄清楚原因 . 如果它很重要,我在Android模拟器上运行它 .

在此先感谢您的帮助 .

1 回答

  • 2

    在删除功能中,您还需要从ObservableArray中删除该项目 .

    viewModel.delete = function() {
        Dialogs.prompt("Task ID", "").then(result => {
            database.execSQL("DELETE FROM tasks WHERE id = ?", [result.text]).then(id => {
               Dialogs.prompt(id);
    
                /// remove the item from the observable array.
               this.tasks.splice(INDEX_OF_THE_ITEM_DELETED,1);
    
    
            }, error => {
                console.log("DELETE ERROR", error);
            });
        });
    }
    

    您可能需要考虑将ObservableArray任务从字符串数组更改为具有 id 属性和 value 属性的对象数组 . 因此,更容易确定要删除的项目的索引 . 如果不是,则必须重建推入数组的值以查找索引 .

相关问题