最初は、NativeScriptが初めてです。私はToDoリストのチュートリアルに続き、ここにはhttps://x-team.com/blog/build-simple-todo-list-mobile-application-nativescript/があります。自分自身のための少し練習として、リスト内のタスクにremove関数を追加したかったのです。NativeScript:UIがリフレッシュせずにObservableArrayから削除されたアイテムを表示しない
ここに私のコードです:
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>
タスク・ビュー・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のエミュレータで実行しています。
ご協力いただきありがとうございます。
配列をオブジェクト配列に変更する方法を見ていただきありがとうございます:) –
これは 'this.tasks.push(_string);ではなく、簡単な部分でなければなりません。 'this.tasks.push({id:id、value:_string});'を実行すると、valueプロパティも使用するようにリストテンプレートを更新する必要があります。 – theOriginalJosh