我正在使用带有附加功能的 angular 和 ui-router,以便在从移动 spa 应用程序的详细信息页面返回时,我可以使用粘性状态来维护列表视图滚动位置。
我的列表是一个剑道移动列表视图。我正在实施 crud,并希望在返回时反映在列表视图中所做的更改。我没有在我的后退按钮中使用 $state.go,而是使用 $window.history.back 因为我希望后退按钮“按预期”工作,所以我不能使用该函数的 reload 参数。
我连接了 onReactivate 并注入具有标志的服务,告诉它是否已完成 crud 操作并重新加载列表。这一切正常,我可以成功确定是否需要重新加载屏幕。
所以,我尝试使用 kendo.mobile.ui.ListView 刷新方法。我使用 angular.element("#idoflistview").data("kendoMobileListView").refresh()。它确实找到并刷新了它,但是所有项目都设置为 style="transform: translate3d(0px, 0px, 0px);",所以它们都相互重叠。
我最初确实尝试只做一个 $state.reload() 并重建页面,它确实有效,因为它在控制器中调用了我的 init 函数,我可以使用标志知道以正确的方式请求数据,但是listview 不会建立。数据请求已发送并检索,但列表视图为空。
如果可能的话,我宁愿只刷新列表,因为服务已经拥有带有更新数据的 kendo 数据源,所以真的不需要再次调用数据库。
因此,我的列表视图设置正常工作,但只有在我刷新 onReactivate 时才会中断,因为它们都在那里,但由于列表中的每个 li 都从 0 开始(虽然更新在那里,所以它确实刷新了)。
我假设这是因为它需要稍后再做。如果是这样,我该怎么做?
关于如何让刷新方法正常工作的任何想法?还是有更好的方法来做到这一点?
这是抽象视图:
<div ui-view="activityinquirylist" ng-show="$state.includes('activityinquiry.list')"></div>
<div ui-view="activityinquirydetails" ng-show="$state.includes('activityinquiry.details')"></div>
<div ui-view="activityinquirycrud" ng-show="$state.includes('activityinquiry.crud')"></div>
这是我声明我的列表视图的方式:
<div id="activityListScroller" kendo-mobile-scroller="activityListScroller" k-pull-to-refresh="true" k-pull="vm.pullToRefresh" k-pull-offset="200" class="scroller-header-footer">
<ul id="activityListView" kendo-mobile-list-view="activityListView" k-data-source="vm.activityInquiryService.activityInqiuryDataSource" k-template="vm.activityTemplate" k-on-click="vm.listClicked(kendoEvent)" k-auto-bind="false" k-load-more="true"></ul>
</div>
这是状态的代码:
.state('activityinquiry', {
//sticky: true,
abstract: true,
url: '/activityinquiry',
templateUrl: 'app/views/cm/activityinquiry.html'
})
.state('activityinquiry.list', {
url: '/activityinquirylist',
views: {
'activityinquirylist@activityinquiry': angularAMD.route({
templateUrl: 'app/views/cm/activityinquirylist.html',
controller: 'activityinquirylistController',
controllerUrl: 'controllers/cm/activityinquirylistController',
controllerAs: "vm"
})
},
sticky: true,
deepStateRedirect: false,
onReactivate: function (activityInquiryService) {
console.log("reactivating");
if (activityInquiryService.model.reloadList && activityInquiryService.model.reloadList == true) {
activityInquiryService.model.reloadList = false;
var item = angular.element("#activityListView").data("kendoMobileListView");
if (item) {
item.refresh();
}
}
}
})
编辑:经过进一步调查,我发现这是由于 kendo.mobile.scroller。在我刷新列表视图时它不可用,因此它以某种方式弄乱了列表视图的绘制方式。这对我来说毫无意义,因为列表视图位于滚动条内(如果我之后检查仍然如此)。如果我删除滚动条,它会按预期工作,但我需要那个滚动条,因为我没有使用剑道视图并且页面上有页脚,所以它会随着内容滚动,我正在使用拉动刷新滚动条的功能(不想使用 listviews pull 来刷新,因为它不允许我处理刷新是如何发生的,而滚动条却可以)。
另一个编辑:我已经追踪到它只有在我在列表视图上加载更多 true 时才会发生。如果我关闭它,那么它工作正常。因此,在上面的代码示例中,如果我设置 k-load-more="false" 它可以工作。我也用无限滚动尝试过,两者都有相同的效果。