Nativescript 删除元素后未刷新Listview

Nativescript 删除元素后未刷新Listview,nativescript,Nativescript,大家好,我是nativescript的新手,当项目被删除时,我遇到了问题,listview没有刷新或删除项目。 这是我的示例代码 ViewModel.js const observableModule = require('data/observable'); const Item = (function (_super) { __extends(Item, _super); function Item(props) { const _this = _super

大家好,我是nativescript的新手,当项目被删除时,我遇到了问题,listview没有刷新或删除项目。 这是我的示例代码

ViewModel.js

const observableModule = require('data/observable');

const Item = (function (_super) {
    __extends(Item, _super);
    function Item(props) {
        const _this = _super.call(this) || this;
        _this.id = props.id;
        _this.ind = props.ind;
        _this.status = props.status;
        return _this;
    }
    return Item;
}(observableModule.Observable));


function Items(Data) {

    let viewModel = {};
    viewModel = new observableModule.fromObjectRecursive({
        items: Data || [],
    });

       viewModel.getItems = function () {
        return server.serverService()
            .then((data) => {
                const list = data.data;
                const formattedList = setListForDisplay(list);
                viewModel.tickets = formattedList;
                return formattedList;
            });
    };

}

function setListForDisplay(list) {
    if (!list.length) { return []; }
    const formattedList = [];
    list.forEach((ticket, ind) => {
        const created = dateService(ticket.created);
        item.date = new Date();
        item.index = ind;
        formattedList[ind] = new Item(item);
    });
    return formattedList;
}
module.exports = Items;
视图模块

  <lv:RadListView id="dataList" items="{{ items }}" >
                <lv:RadListView.itemTemplate>
                        <GridLayout class="ab_tp_item" tap="itemDelete" rows="*" columns="*" >
<Label row="0" col="auto"  text="random text" />
                        </GridLayout>
                </lv:RadListView.itemTemplate>
            </lv:RadListView>

问题是,当我尝试使用itemDelete函数删除项时,它不会做任何事情,看起来它从列表中删除了元素,但视图根本不会得到更新。。。如果我假设我在视图模型中以错误的方式创建项目,那么会出现什么问题呢。。。这里有很多错误。首先,为了处理绑定,必须使用可观察数组()

这应该可以解决你正在进行的事情,但即使这样,你也有问题,因为如果你知道你点击了哪个项目,你没有一个方法。itemDelete假设您正在自动删除列表中的第二项。那没什么用

我看到您正在复制来自typescript编译器的数据,并将其与代码一起添加。我试图修复您的代码,但决定只做一个游乐场应用程序,向您展示一个工作示例

到这里的操场去

转到home-view-model.js

请参阅getItems函数。我给你两种向你的可观察数组中添加项目的方法

您可以推送项目,也可以使用另一个可观察数组覆盖属性

此外,如果要将数组传递给对象,那么它仍然需要是可观察数组,否则页面将不会刷新

下一件事是,我也不知道为什么要设置页面加载超时。您希望尽快开始,因为您必须到其他地方获取数据。另外,在页面可用后运行此操作会导致将视图模型绑定到页面,因此也没有理由使用超时。让我知道这是否有帮助。祝你好运我知道刚开始使用Nativescript的感觉。文档并不像他们希望的那样直截了当,他们现在已经从docs网站上删除了所有好的教程。希望你能读到旧杂货教程。这是一个很好的方式开始与明确简洁的指示

另外,因为这里的人讨厌链接(他们可以相对容易地被破坏,下面是3个文件中的代码)

查看XML

<Page 
loaded="pageLoaded" 
class="page" 
xmlns:lv="nativescript-ui-listview"
xmlns="http://www.nativescript.org/tns.xsd">

<ActionBar title="Home" class="action-bar">
</ActionBar>
<StackLayout>
    <lv:RadListView items="{{ items }}">
        <lv:RadListView.itemTemplate>
            <StackLayout orientation="horizontal">
                <Label fontSize="20" text="{{ userId }}" />
                <Label fontSize="14" text="{{ title }}" />
                <Button text="Delete" tap="delete"/>
            </StackLayout>
        </lv:RadListView.itemTemplate>
    </lv:RadListView>
</StackLayout>
视图模型JS

var observableModule = require("data/observable");
var ObservableArray = require("data/observable-array").ObservableArray;
var http = require("http");


function HomeViewModel(Data) {
    var viewModel = observableModule.fromObject({
    items: Data || new ObservableArray(),
 });

viewModel.emptyList = function () {
    while (this.items.length) {
        this.items.pop();
    }
}

viewModel.remove = function (node) {
    let index = this.items.map(function (e) { return e.id;}).indexOf(node);
    this.items.splice(index, 1); 
} 

viewModel.getItems = function () {
    var vm = this;
    /* 
    * Way One If you don't need to normalize the data
    */

    /* 
        return http.getJSON("https://jsonplaceholder.typicode.com/posts")
          .then((response) => {
              vm.items = new ObservableArray(response);
          }, (e) => {
              console.log(e.message);
          }); 
    */

   /* 
    * Way TWo If you need to normalize the data
    */
     return http.getJSON("https://jsonplaceholder.typicode.com/posts")
      .then((response) => {
          let length = response.length;
          for (var i = 0; i < length; i++) {
              let el = response[i];
              el.title = 'Something different ' + i;
              vm.items.push(el);
          }
      }, (e) => {
          console.log(e.message);
      }); 
    };
    return viewModel;
}

module.exports = HomeViewModel;
var observableModule=require(“数据/可观察”);
var ObservableArray=要求(“数据/可观测数组”)。ObservableArray;
var http=require(“http”);
函数HomeViewModel(数据){
var viewModel=observableModule.fromObject({
项目:数据| |新ObservableArray(),
});
viewModel.emptyList=函数(){
while(this.items.length){
this.items.pop();
}
}
viewModel.remove=函数(节点){
让index=this.items.map(函数(e){returne e.id;}).indexOf(节点);
本标准中的项目拼接(索引1);
} 
viewModel.getItems=函数(){
var vm=这个;
/* 
*如果不需要规范化数据,方法一
*/
/* 
返回http.getJSON(“https://jsonplaceholder.typicode.com/posts")
。然后((响应)=>{
vm.items=新的ObservableArray(响应);
},(e)=>{
控制台日志(e.message);
}); 
*/
/* 
*如果需要规范化数据,方法二
*/
返回http.getJSON(“https://jsonplaceholder.typicode.com/posts")
。然后((响应)=>{
设长度=响应长度;
对于(变量i=0;i{
控制台日志(e.message);
}); 
};
返回视图模型;
}
module.exports=HomeViewModel;

嗯……这里有很多错误。首先,为了处理绑定,必须使用可观察数组()

这应该可以解决您的问题,但即使这样,您也会遇到问题,因为如果知道您点击了哪个项目,您没有方法。您的itemDelete假定您正在自动删除列表中的第二个项目。这不会很有用

我看到您正在复制来自typescript编译器的数据,并将其与代码一起添加。我试图修复您的代码,但决定只做一个游乐场应用程序,向您展示一个工作示例

到这里的操场去

转到home-view-model.js

请参阅getItems函数。我提供了两种将项添加到可观察数组的方法

您可以推送项目,也可以使用另一个可观察数组覆盖属性

此外,如果要将数组传递给对象,那么它仍然需要是可观察数组,否则页面将不会刷新

下一件事是我也不确定你为什么要在页面加载上设置超时。你想尽快开始,因为你必须去其他地方获取数据。另外,你在页面可用后运行此操作,因为你将视图模型绑定到页面,所以再次没有理由使用超时。如果这有帮助,请告诉我。很好ck。我知道刚开始使用Nativescript的感觉。文档并不像他们希望的那样简单明了,他们现在已经从文档网站上删除了所有好的教程。希望你能访问旧的杂货教程。这是一个以清晰简洁的说明开始的好方法

另外,因为这里的人讨厌链接(他们可以相对容易地被破坏,下面是3个文件中的代码)

查看XML

<Page 
loaded="pageLoaded" 
class="page" 
xmlns:lv="nativescript-ui-listview"
xmlns="http://www.nativescript.org/tns.xsd">

<ActionBar title="Home" class="action-bar">
</ActionBar>
<StackLayout>
    <lv:RadListView items="{{ items }}">
        <lv:RadListView.itemTemplate>
            <StackLayout orientation="horizontal">
                <Label fontSize="20" text="{{ userId }}" />
                <Label fontSize="14" text="{{ title }}" />
                <Button text="Delete" tap="delete"/>
            </StackLayout>
        </lv:RadListView.itemTemplate>
    </lv:RadListView>
</StackLayout>
视图模型JS

var observableModule = require("data/observable");
var ObservableArray = require("data/observable-array").ObservableArray;
var http = require("http");


function HomeViewModel(Data) {
    var viewModel = observableModule.fromObject({
    items: Data || new ObservableArray(),
 });

viewModel.emptyList = function () {
    while (this.items.length) {
        this.items.pop();
    }
}

viewModel.remove = function (node) {
    let index = this.items.map(function (e) { return e.id;}).indexOf(node);
    this.items.splice(index, 1); 
} 

viewModel.getItems = function () {
    var vm = this;
    /* 
    * Way One If you don't need to normalize the data
    */

    /* 
        return http.getJSON("https://jsonplaceholder.typicode.com/posts")
          .then((response) => {
              vm.items = new ObservableArray(response);
          }, (e) => {
              console.log(e.message);
          }); 
    */

   /* 
    * Way TWo If you need to normalize the data
    */
     return http.getJSON("https://jsonplaceholder.typicode.com/posts")
      .then((response) => {
          let length = response.length;
          for (var i = 0; i < length; i++) {
              let el = response[i];
              el.title = 'Something different ' + i;
              vm.items.push(el);
          }
      }, (e) => {
          console.log(e.message);
      }); 
    };
    return viewModel;
}

module.exports = HomeViewModel;
var observableModule=require(“数据/可观察”);
var ObservableArray=要求(“数据/可观测数组”)。ObservableArray;
var http=require(“http”);
函数HomeViewModel(数据){
var viewModel=observableModule.fromObject({
项目:数据| |新ObservableArray(),
});
viewModel.emptyList=函数(){
while(this.items.length){
this.items.pop();
}
}
viewModel.remove=函数(节点){
让index=this.items.map(函数(e){returne e.id;})。