我们说我有很长的项目清单。
this.items = [{id: 1, name: 'one'}, {id: 2, name: 'two'}, ...]; // 2000 items
我希望在没有重载浏览器的情况下显示它们。 我的模板:
<div ng-repeat="item in $ctrl.items">
<span>{{ ::item.id }}</span>
</div>
它只为items
数组提供了一个观察者,我的列表滚动得足够快。
但是,我想说我想要两种不同的模式:一种显示ID,另一种显示名称。
在控制器中:
this.modeId = true;
在模板中:
<div ng-repeat="item in $ctrl.items">
<span ng-if="$cltr.modeId">{{ ::item.id }}</span>
<span ng-if="!$cltr.modeId">{{ ::item.name }}</span>
</div>
Aaaaa和我有4001观察者。浏览器碾压,我哭了。
为什么角度不缓存$ctrl.modeId
,它是整个模板的相同变量,为什么它需要观察那个该死的变量4000次。
有没有解决方法?
PS。我无法进行一次性绑定,因为我有一个按钮,可以切换模式。是的,我可以在ng-repeat
中包装整个<div ng-if="$ctrl.modeId">...</div>
,但每次模式切换时都会渲染2000消耗这么多资源。
答案 0 :(得分:0)
您可以使用Angularjs的模板缓存功能,如下所示。
let runningSrtring = UserDefaults.standard.object(forKey: CurrentURL) as! NSString
if runningSrtring.isEqual(to: videoString) {
//self.view.layer.sublayers?.forEach { $0.removeFromSuperlayer() }
videoPlayButton.setImage(UIImage(named: "Pause"), for: .normal)
let duration : CMTime = mediaPlayer.currentItem!.asset.duration
let seconds : Float64 = CMTimeGetSeconds(duration)
self.videoSlider.value = Float(CMTimeGetSeconds((mediaPlayer.currentTime())))
videoSlider.minimumValue = 0
videoSlider.maximumValue = Float(seconds)
let playerLayer = AVPlayerLayer(player: mediaPlayer)
playerLayer.frame = self.view.frame
playerLayer.backgroundColor = UIColor.black.cgColor
//playerLayer.videoGravity = AVLayerVideoGravityResize
playerLayer.videoGravity = AVLayerVideoGravityResizeAspect
self.view.layer.addSublayer(playerLayer)
mediaPlayer.addPeriodicTimeObserver(forInterval: CMTimeMakeWithSeconds(1, 1), queue: DispatchQueue.main) { (CMTime) -> Void in
if mediaPlayer.currentItem?.status == .readyToPlay {
self.videoSlider.value = Float(CMTimeGetSeconds((mediaPlayer.currentTime())))
let currentTime : Int = Int(CMTimeGetSeconds(mediaPlayer.currentTime()))
let minutes = currentTime/60
let seconds = currentTime - minutes * 60
self.durationLabel.text = NSString(format: "%02d:%02d", minutes,seconds) as String
}
}
}
要稍后检索模板,只需在组件中使用它:
<script type="text/ng-template" id="templateId.html">
<div ng-repeat="item in $ctrl.items">
<span>{{ ::item.id }}</span>
</div>
</script>
或通过$ templateCache服务获取它:
myApp.component('myComponent', {
templateUrl: 'templateId.html'
});