【问题标题】:How to remember Ionic Range slider position $ionicPopup如何记住离子范围滑块位置 $ionicPopup
【发布时间】:2016-07-11 09:18:29
【问题描述】:

我有更改页面字体大小的指令:

.directive('textSizeSlider', ['$document', function ($document) {
    return {
      restrict: 'E',
      template: '<div class="range"><i class="icon" ng-style="{ fontSize: min + unit }">A-</i><input type="range" min="{{ min }}" max="{{ max }}" step="{{ step || 0 }}" ng-model="textSize" value="{{ value }}" /><i class="icon" ng-style="{ fontSize: max + unit }">A+</i></div>',
      scope: {
        min: '@',
        max: '@',
        unit: '@',
        value: '@',
        step: '@'
      },
      link: function (scope, element, attr) {
        scope.textSize = scope.value;
        scope.$watch('textSize', function (size) {
            var x = document.getElementsByTagName("P");
            var i;
            for (i = 0; i < x.length; i++) {
            x[i].style.fontSize = size + scope.unit;
            }
        });
      }
    }
  }]);

在我的页面上,通过按钮单击打开弹出窗口以减小/增加字体大小。但是每次我打开弹出范围滑块时,我的控制器中都会设置默认位置值。如何保存范围的更改值?这是我在控制器中的功能:

  $scope.fontAdjust = function() {

    var alertPopup = $ionicPopup.alert({
    title: 'Font adjustment',
    template: '<text-size-slider min="10" max="18" unit="px" value="14" step="0"></text-size-slider>'
    })

   }

【问题讨论】:

    标签: ionic-framework angular-ngmodel ionic-popup


    【解决方案1】:

    在控制器中添加了什么:

    1. 在控制器中有一个$scope.vm.fontSize 变量,并像这样在模板中使用它

      template: '<text-size-slider min="10" max="18" unit="px" value="vm.fontSize" step="0"></text-size-slider>'
      

      您可以阅读Understanding Scopes 以了解我为什么使用vm.fontSize 而不是原始的fontSize

    2. 在控制器中添加一个监视以通知更改的值。此处更改的值可以保存在某处,例如在localStorage

      $scope.$watch('vm.fontSize', function (newValue, oldValue) {
        console.log(newValue);
        localStorage.fontSize = newValue;
      });
      

    然后在您的指令中使用以下代码:

    return {
      restrict: 'E',
      template: '<div class="range"><i class="icon" ng-style="{ fontSize: min + unit }">A-</i><input type="range" min="{{ min }}" max="{{ max }}" step="{{ step || 0 }}" ng-model="value" /><i class="icon" ng-style="{ fontSize: max + unit }">A+</i></div>',
      scope: {
        min: '@',
        max: '@',
        unit: '@',
        value: '=',
        step: '@'
      },
      link: function (scope, element, attr) {
        scope.textSize = scope.value; // This is not required
        scope.$watch('value', function (size) {
          var x = document.getElementsByTagName("P");
          var i;
          for (i = 0; i < x.length; i++) {
            x[i].style.fontSize = size + scope.unit;
          }
        });
      }
    }
    

    指令的变化:

    1. value: '@'value: '='。这是在外部范围内使用相同的引用,然后在指令范围内创建一个本地引用。 Read More
    2. template 属性中,添加ng-model="value" 以将value(从外部范围)直接绑定到ng-model,并删除value 属性,因为ng-model 会自动更新它并且是不必要的。李>
    3. 直接在 value 上添加了手表,而不是在 textSize 上添加了手表,这使得它没有必要。

    加载控制器时,您可以读取localStorage.fontSize 并将其分配给$scope.vm.fontSize,并在其值更改时将其保存回localStorage.fontSize

    【讨论】:

    • 感谢您的回答。但是您在开始时错过了 font-size 值,我尝试了这个示例,但它不起作用(((
    • 在你的控制器中,你可以试试这个$scope.vm = {}; $scope.vm.fontSize = 12; if(localStorage.fontSize) { $scope.vm.fontSize = parseInt(localStorage.fontSize); }。这有帮助吗?
    • 不要(((也许您可以使用 Codepen 或 IonicPlay 示例?
    • Please check this 告诉我。我没有使用 Cancel 和 OK 按钮,而是使用 $watch 保存,所以您可能只弹出 OK 按钮。
    • 请查看我在 html 代码 &lt;ion-pane ng-controller="MyController" ng-style="{'fontSize': vm.fontSize + 'px'}"&gt; 中使用的更新代码,它读取 vm.fontSize 并将内联样式应用于 ion-pane's 元素,由于 CSS 继承,将设置此字体大小到所有元素(只要适用,如divpanchorspan 元素)。我添加了一个div 来演示。由于您只想增加段落的字体大小,因此您可能需要将此 ng-style 代码放在每个段落元素中。
    猜你喜欢
    • 2017-11-04
    • 1970-01-01
    • 2021-10-08
    • 1970-01-01
    • 1970-01-01
    • 2018-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多