【问题标题】:How to update the scope value without using $watch如何在不使用 $watch 的情况下更新范围值
【发布时间】:2026-01-23 16:55:15
【问题描述】:

我有使用自定义指令

<users stats="stats"></users>

当我们从主控制器更改范围对象时,我也更新了指令范围值

app.directive('users', function(){
    var directive = {};
    directive.restrict = "E";
    directive.templateUrl = "templates/partials/users_stats.html";
    directive.scope = {stats:'='};
    directive.controller = "userStatsCtrl"
    return directive;
});

所以,在指令控制器内部,我正在做一些功能。喜欢

app.controller("userStatsCtrl", function($scope){
    $scope.$watch('stats', function(newValue) {
      if (angular.isDefined(newValue)) {
        .....
      }
    });
})

所以在这里,我使用 $watch 来监听范围,如果是更新,我会执行一些操作。

我的问题是,我不想使用 watch 来监听范围,如果范围得到更新,我需要执行一些操作。

那么如何在不使用 scope.$watch 的情况下更新作用域值

【问题讨论】:

  • 你为什么不用$watch
  • 它将影响整个范围对象。但是,这里的特定对象只会改变。性能标准。
  • 最好使用 $watch,除非你有很多,否则不会有任何性能问题。此外,如果您想在对象中查看更精确的内容,请使用 $scope.$watch{function(){ return stats.a}, function(newValue){[process...]});

标签: javascript angularjs


【解决方案1】:

当你的主控制器中的“scope.stats”值发生变化时,你可以广播一个事件并在你的指令中接收相同的事件,然后做任何你想做的操作。 广播事件的示例代码:

$scope.$broadcast('yourEventName');

在指令中接收事件:

$scope.$on('yourEventName', function(){

});

【讨论】:

  • 范围未更新。如果我确实更新了该范围,则不会影响此处。
  • 页面加载时,该时间数据仅来自范围
【解决方案2】:

试试怎么样:

<users stats="stats" ng-change="onUserStatChange($event)"></users> 
                           or
<users stats="stats" ng-blur="onUserStatChange($event)"></users>

然后在控制器中:

$scope.onUserStatChange = function(event) {
    //event.whatever
}

【讨论】:

  • 如果我使用 ng-change="onUserStatChange($event)",我得到错误:[$compile:ctreq]
  • 如果你使用 ng-change,你必须同时使用 ng-model。
最近更新 更多