如何在ng-repeat中缓存变量?

时间:2017-02-01 11:35:24

标签: javascript angularjs ng-repeat

我们说我有很长的项目清单。

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消耗这么多资源。

1 个答案:

答案 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'
});