【问题标题】:angular.element is not working in tabset directive of angular jsangular.element 在 Angular js 的 tabset 指令中不起作用
【发布时间】:2015-06-02 10:00:56
【问题描述】:

我正在使用 Angular js 的 tabset 指令并在选项卡中使用 twitter 引导滑块,

我的 slidestop 事件没有调用,但它在选项卡之外运行良好。

我知道 tabset 指令有自己的范围,但不知道以下问题的解决方案:-

<tabset class="tab-container">
    <tab heading="tab1">
               <div class="form-group">

                   <label>any Level</label>

                   <div class="input-group w-md">
                        <input id="slider" ui-jq="slider" ui-options="{min: 0,max: 10,step: 1,value: {{any_level}}}"
                       class="slider slider-horizontal form-control" type="text"
                       ng-model="any_level"> {{any_level}}

                  </div>
               </div>
    </tab>
</tabset>

控制器代码

 ......
angular.element("#slider").on('slideStop', function(data){
       alert('asdasd');

 })

问题是 - 当滑块在标签内时不会发出警报,当滑块在标签外时会发出警报

我正在使用this slider

谢谢

【问题讨论】:

  • 那么什么不起作用?你只是说它在外面工作,但告诉我们它在里面的表现。
  • @Okazari 更改滑块时不会发出警报

标签: angularjs twitter-bootstrap


【解决方案1】:

我已经解决了使用 ui-event 指令触发 slidestop 事件

HTML 代码

<input id="slider" 
        ui-event="{slideStop: 'alertChange($event)'}"  ui-jq="slider" 
        ui-options="{min: 0,max: 10,step: 1,value: {{any_level}}}"
        class="slider slider-horizontal form-control" type="text"  ng-model="any_level">


{{any_level}}

控制器代码

$scope.alertChange = function(data){
   console.log(data.value); // i can get slider value on slidestop

}

【讨论】:

    【解决方案2】:

    只是不要在 Angular 应用中使用 angular.element

    编辑:这实际上不适用于 ui-slider。直到 ui-slider 正在进行中,我才不会使用它。

    将此添加到您的输入中:

    ng-change="alertChange()"
    

    这是你的控制器:

    $scope.alertChange = function(){
       alert('hi');
    }
    

    什么不工作?在大多数情况下,angular.element 会尝试过早地将您的偶数绑定到元素。当您尝试绑定时,您的 DOM "#slider" 元素可能未加载。

    编辑另一种选择:

    首先,在更加关注之后,我根本不会推荐这个滑块。 这实际上是一项正在进行的工作,并不可靠。

    我在plunker 中为您制作了一个带有绑定的 html 滑块的示例

    你的滑块看起来像这样:

    <input id="slider" 
           ng-model-options="{ debounce: 100 }" 
           min="0"
           max="100" 
           ng-init="any_level = 0" 
           ng-change="alertChange()"
           type="range" 
           ng-model="any_level">
    

    这将在每次值在 100 毫秒内不变时更新模型。你需要这个来避免触发过多的 ng-change 函数。

    在你的javascript中你只需要声明你的函数

    $scope.alertChange = function(){
       console.log("I changed !");
       //or anything else you want to do
    }
    

    我知道这不是解决方案,而是替代方案。它不像其他滑块那样性感,但至少它有效。

    希望对你有所帮助。

    【讨论】:

    • 您可以将这种方法与ng-mouseup 一起使用,或者按照此处stackoverflow.com/questions/26710485/… 的描述使用带有超时的$watch
    • @seanhodges - slideStop 事件给了我滑块值,我在 ng-mouseup angular.element("#slider").on('slideStop', function(data){ -- - 我可以从 data.value 接收值
    • 在不知道您使用的是哪种滑块解决方案的情况下,很难知道您为什么会以错误的方式做事。 Angular 模块通常具有ng-click 风格的属性,允许您在加载生命周期的正确时间附加到事件。
    • @kishor 添加了一个带有 html 滑块输入的工作示例的 plunker。这是另一种选择,但我不能让你的滑块工作......
    • @seanhodges 实际上这个 ui-slider 不是很好用。我怀疑它会触发 ng-change 和 ng-mouseup。但这是一个很好的建议。
    【解决方案3】:

    您使用的滑块有一个示例演示如何执行此操作。看看这个页面上的“12”框:http://angular-ui.github.io/ui-slider/demo/demo.html

    在您的控制器中,您可以添加以下内容:

    $scope.slider = {
        'options': {
            stop: function (event, ui) { $log.info('Slider stop'); }; 
    }
    

    您的 HTML 必须引用 slider.options 以便触发回调:

    <div ui-slider="slider.options"
         min="0" max="50" ng-model="any_level"></div>
    

    【讨论】:

    • 我有点困惑。我也试过这个,但我不能让它太有效。这个滑块是否有任何关于如何使用指令的文档?
    • 文档似乎包含源代码和我上面链接的演示页面。老实说,正如@Okazari 所建议的那样,这个特殊的滑块项目感觉还没有完成,可能还没有准备好迎接黄金时段,因此没有文档。
    猜你喜欢
    • 1970-01-01
    • 2015-03-30
    • 2015-06-24
    • 1970-01-01
    • 1970-01-01
    • 2015-10-21
    • 2016-09-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多