带有 ng-repeat 的 Ionic (angularjs) ion-slide-box 不更新
Ionic (angularjs) ion-slide-box with ng-repeat not updating
我有一个 ion-slide-box
使用 ng-repeat
显示从远程服务器获取的图像。
<ion-slide-box on-slide-changed="slideChanged(index)" auto-play="true" does-continue="true">
<ion-slide ng-repeat="slide in files">
<img ng-src="{{slide.filename}}" >
</ion-slide>
</ion-slide-box>
和 js:
$scope.getFiles = function() {
Files.query({
//some parameters
}).$promise.then(function(data) {
$scope.files = data;
});
调用 getFiles() 时(它触发此处未显示的服务),$scope.files 已成功更新。但是 DOM(加载到 ion-slide-box 中的图像)不会自动更新。如何刷新 DOM?我已经尝试了 timeout
(没有任何反应)和 $scope.$apply
(抛出 $dispatch 已经停止的错误。)
尽管这是一个移动应用程序,但在桌面浏览器中进行测试时,我可以调整浏览器的大小并自动显示图像。所以要么我弄清楚如何保持更新,要么找到更好的图像 slider/carousel 来使用。
而不是:
$scope.files = data;
尝试:
$scope.files.splice(0,$scope.files.length);
$scope.files = $scope.files.concat(data);
这应该允许您在不丢失初始内存引用的情况下更新数组的内容。
注意:我假设 $scope.files 和数据是数组。
您需要在更改作用域变量后调用$ionicSlideBoxDelegate.update()
方法。 slidebox不会自动监听最新版本框架的变化
http://ionicframework.com/docs/nightly/api/service/$ionicSlideBoxDelegate/
您应该设置一个 delegate-handle
属性并使用它来确保您不会干扰您在当时加载的任何其他幻灯片。
html
<ion-slide-box delegate-handle="image-viewer" on-slide-changed="slideChanged(index)" auto-play="true" does-continue="true">
<ion-slide ng-repeat="slide in files">
<img ng-src="{{slide.filename}}" >
</ion-slide>
</ion-slide-box>
js
$scope.getFiles = function() {
Files.query({
//some parameters
}).$promise.then(function(data) {
$scope.files = data;
$ionicSlideBoxDelegate.$getByHandle('image-viewer').update();
});
}
我相信这会在不久的将来发生变化,因此您的代码将按预期工作。他们正在开发一个更新的 slidebox 组件,但在最后一刻被取消以加快最新版本的速度。
要正常工作必须做到以下几点。
经过8小时的测试,实现上网搜索找到正确的解决方案。
<ion-slide-box on-slide-changed="slideChanged(index)" auto-play="true" does-continue="true">
<ion-slide ng-repeat="slide in files">
<img ng-src="{{slide.filename}}" >
</ion-slide>
</ion-slide-box>
delegate-handle="image-viewer" 不必在 ion-slide-box 中必须在 <ion-content delegate-handle="mainhanddle">
并且从控制器必须执行这两个命令:
$ionicSlideBoxDelegate.update();
$ionicSlideBoxDelegate.$getByHandle('mainhanddle').update();
每次通话结束时。
要在此处添加此内容,<ion-slide-box delegate-handle="image-viewer"
其他重要属性(例如取消和 nr-repeat)无法正常工作。
好吧,希望对您有所帮助,如果您需要更多详细信息,请随时与我联系。
您需要等待 ng-repeat 渲染完成才能更新()您的幻灯片框,请使用此指令:
angular.module('starter')
.directive('repeatDone', function () {
return function (scope, element, attrs) {
if (scope.$last) { // all are rendered
scope.$eval(attrs.repeatDone);
}
}
})
HTML :
<ion-slide-box>
<ion-slide ng-repeat="day in week" repeat-done="repeatDone()" >
在你的控制器中
$scope.getFiles = function() {
Files.query({
//some parameters
}).$promise.then(function(data) {
$scope.week = data;
});
$scope.repeatDone = function() {
$ionicSlideBoxDelegate.update();
//$ionicSlideBoxDelegate.slide($scope.week.length - 1, 1);
};
我使用库 ion-image-lazy-load 解决了这个问题。试试这个方法:
JS:
.controller('myCtrl', function ($scope) {
$scope.images = imagesArray(); // Get array of objects with image urls
$scope.slider = {
options: {
direction: 'horizontal',
slidesPerView: '1',
grabCursor: true
}
};
});
查看:
<ion-content lazy-scroll>
<ion-slide-box style="width:100% !important">
<ion-slide ng-repeat="slide in images">
<img image-lazy-src="{{slide.url}}" lazy-scroll-resize="true" image-lazy-loader="lines" style="width:100%">
</ion-slide>
</ion-slide-box>
</ion-content>
我有一个 ion-slide-box
使用 ng-repeat
显示从远程服务器获取的图像。
<ion-slide-box on-slide-changed="slideChanged(index)" auto-play="true" does-continue="true">
<ion-slide ng-repeat="slide in files">
<img ng-src="{{slide.filename}}" >
</ion-slide>
</ion-slide-box>
和 js:
$scope.getFiles = function() {
Files.query({
//some parameters
}).$promise.then(function(data) {
$scope.files = data;
});
调用 getFiles() 时(它触发此处未显示的服务),$scope.files 已成功更新。但是 DOM(加载到 ion-slide-box 中的图像)不会自动更新。如何刷新 DOM?我已经尝试了 timeout
(没有任何反应)和 $scope.$apply
(抛出 $dispatch 已经停止的错误。)
尽管这是一个移动应用程序,但在桌面浏览器中进行测试时,我可以调整浏览器的大小并自动显示图像。所以要么我弄清楚如何保持更新,要么找到更好的图像 slider/carousel 来使用。
而不是:
$scope.files = data;
尝试:
$scope.files.splice(0,$scope.files.length);
$scope.files = $scope.files.concat(data);
这应该允许您在不丢失初始内存引用的情况下更新数组的内容。
注意:我假设 $scope.files 和数据是数组。
您需要在更改作用域变量后调用$ionicSlideBoxDelegate.update()
方法。 slidebox不会自动监听最新版本框架的变化
http://ionicframework.com/docs/nightly/api/service/$ionicSlideBoxDelegate/
您应该设置一个 delegate-handle
属性并使用它来确保您不会干扰您在当时加载的任何其他幻灯片。
html
<ion-slide-box delegate-handle="image-viewer" on-slide-changed="slideChanged(index)" auto-play="true" does-continue="true">
<ion-slide ng-repeat="slide in files">
<img ng-src="{{slide.filename}}" >
</ion-slide>
</ion-slide-box>
js
$scope.getFiles = function() {
Files.query({
//some parameters
}).$promise.then(function(data) {
$scope.files = data;
$ionicSlideBoxDelegate.$getByHandle('image-viewer').update();
});
}
我相信这会在不久的将来发生变化,因此您的代码将按预期工作。他们正在开发一个更新的 slidebox 组件,但在最后一刻被取消以加快最新版本的速度。
要正常工作必须做到以下几点。 经过8小时的测试,实现上网搜索找到正确的解决方案。
<ion-slide-box on-slide-changed="slideChanged(index)" auto-play="true" does-continue="true">
<ion-slide ng-repeat="slide in files">
<img ng-src="{{slide.filename}}" >
</ion-slide>
</ion-slide-box>
delegate-handle="image-viewer" 不必在 ion-slide-box 中必须在 <ion-content delegate-handle="mainhanddle">
并且从控制器必须执行这两个命令:
$ionicSlideBoxDelegate.update();
$ionicSlideBoxDelegate.$getByHandle('mainhanddle').update();
每次通话结束时。
要在此处添加此内容,<ion-slide-box delegate-handle="image-viewer"
其他重要属性(例如取消和 nr-repeat)无法正常工作。
好吧,希望对您有所帮助,如果您需要更多详细信息,请随时与我联系。
您需要等待 ng-repeat 渲染完成才能更新()您的幻灯片框,请使用此指令:
angular.module('starter')
.directive('repeatDone', function () {
return function (scope, element, attrs) {
if (scope.$last) { // all are rendered
scope.$eval(attrs.repeatDone);
}
}
})
HTML :
<ion-slide-box>
<ion-slide ng-repeat="day in week" repeat-done="repeatDone()" >
在你的控制器中
$scope.getFiles = function() {
Files.query({
//some parameters
}).$promise.then(function(data) {
$scope.week = data;
});
$scope.repeatDone = function() {
$ionicSlideBoxDelegate.update();
//$ionicSlideBoxDelegate.slide($scope.week.length - 1, 1);
};
我使用库 ion-image-lazy-load 解决了这个问题。试试这个方法:
JS:
.controller('myCtrl', function ($scope) {
$scope.images = imagesArray(); // Get array of objects with image urls
$scope.slider = {
options: {
direction: 'horizontal',
slidesPerView: '1',
grabCursor: true
}
};
});
查看:
<ion-content lazy-scroll>
<ion-slide-box style="width:100% !important">
<ion-slide ng-repeat="slide in images">
<img image-lazy-src="{{slide.url}}" lazy-scroll-resize="true" image-lazy-loader="lines" style="width:100%">
</ion-slide>
</ion-slide-box>
</ion-content>