删除元素后未刷新Listview

时间:2018-09-10 14:04:02

标签: nativescript

您好,我是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>

items.js

const timer = require('timer');
let ItemsModel = require('../view-models/items-view-model');

ItemsModel = new ItemsModel();
function DataLoaded(args) {
  const page = args.object;
   page.bindingContext = ItemsModel;
  timer.setTimeout(() => {
        ItemsModel.getItems()
            .then((list) => {
            });
    }, 100);
}

function itemDelete() {
  page.bindingContext.items.splice(1,1);
}
module.exports = {
   DataLoaded,
   itemDelete
};

问题是,当我尝试使用itemDelete函数删除项目时,它似乎没有执行任何操作,好像它从列表中删除了元素,但是视图根本没有更新...这可能是我假设Im创建项目错误的问题。视图模型。

1 个答案:

答案 0 :(得分:2)

嗯...这里有很多错误。首先,为了处理绑定,您必须使用Observable Array()。

那应该可以解决您的问题,但是即使那样您仍然会遇到问题,因为如果您知道要轻按哪个项目,就没有办法。您的itemDelete假定您正在自动删除列表中的第二个项目。那不会很有用。

我看到您要复制来自打字稿编译器,并将其与您的代码一起添加。我试图修复您的代码,但决定只做一个Playground应用程序来向您展示一个有效的示例。

去这里https://play.nativescript.org/?template=play-js&id=Z5745I&v=3的操场

转到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 frameModule = require("ui/frame");
var ItemsModel = require("./home-view-model");

var itemsModel = new ItemsModel();

exports.pageLoaded = function(args) {
    var page = args.object;
    page.bindingContext = itemsModel;
    itemsModel.getItems();
}

exports.delete = function (args) {
    var item = args.object.bindingContext;
    let id = item.id;
    itemsModel.remove(id);
}

查看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;