使用 AngularJS,如何在视图和控制器同步特定更改后触发代码执行?

Posted

技术标签:

【中文标题】使用 AngularJS,如何在视图和控制器同步特定更改后触发代码执行?【英文标题】:With AngularJS, how to trigger code to be executed after the view and controller have synced a particular change? 【发布时间】:2012-07-28 14:09:27 【问题描述】:

具体来说,我在某些日期范围内将 AJAX 处理成一对 SELECT(使用 AngularJS ng-repeat 维护),然后我使用 jQuery UI 的 selectToUISlider 将其变成一个滑块。我假设如果它正在运行的 SELECT 在运行时被修改,则 selectToUISlider 的行为是未定义的。有没有办法确保只有在 AngularJS 完成更新后才调用它?我还没有遇到任何问题,但我不确定我只是幸运,或者我的电脑没有在正确的时刻出现延迟,等等......

我可以想到两种解决方案,但似乎都不是很好:

不要使用 ng-repeater;使用 jQuery 构建 SELECT。但不得不这样做会很遗憾。 使用 setTimeout 延迟对 selectToUISlider 的调用。但这似乎……不优雅。

【问题讨论】:

【参考方案1】:

我不知道 selectToUISlider 是如何工作的,但你想要一个指令。在该指令中, $watch 用于更改列表并更新滑块,但它应该完成。

http://docs.angularjs.org/api/ng.$rootScope.Scope#$watch

示例 html

<select jq-slider="myList" ng-options="item.val for item in myList"></select>

示例 JS:

myApp.directive('jqSlider', function() 
  return 
    link: function(scope, elm, attrs) 
      scope.$watch(attrs.jqSlider, function whenMyListChanges(newValue, oldValue) 
        $(elm).applySelectUISliderUpdateForNewValues();
      );
    
  ;
);

【讨论】:

啊,很有前途!谢谢!我唯一不确定的是:selectToUISlider 是建立在两个 SELECTs 之上的。一个代表范围的起始值,另一个代表结束值。假设AngularJS按照它们出现在页面上的顺序更新HTML元素是否安全?我可以将指令绑定到第二个 SELECT 并知道第一个也已更新吗?

以上是关于使用 AngularJS,如何在视图和控制器同步特定更改后触发代码执行?的主要内容,如果未能解决你的问题,请参考以下文章

AngularJS2

angularJS实现不同视图同步刷新

AngularJS:如何从控制器功能切换视图?

如何使用AngularJs获取时间,然后将其绑定到从视图到控制器的输入时间

一旦AngularJs中的数据库发生变化,如何实现自动视图更新?

如何将文件夹中包含的控制器动态绑定到angularjs中的视图