【问题标题】:Why cant I pass an element attribute to scope.$watch but i can pass a function that returns it为什么我不能将元素属性传递给 scope.$watch 但我可以传递一个返回它的函数
【发布时间】:2017-10-12 00:07:03
【问题描述】:

我用下面的代码写了一个指令watchId

.directive('watchId', function(){
 return {
  restrict: 'A',
  link: function(scope, elem, attr) {
   scope.$watch(function() { return elem.attr('id') }, function(newValue){
    if (newValue) {
     scope.loaded[newValue] = true
    }
   })
  }
 }
})

上面的代码可以正常工作,但我的问题是为什么我不能只做scope.$watch(elem.attr('id'), function(newValue) {

我认为不需要它,但这里有一个JSfiddle,我在上面玩。

【问题讨论】:

    标签: javascript angularjs angular2-directives


    【解决方案1】:

    因为 elem 不是 $scope 字段(而是由 angular 注入的服务),并且该语法仅对 $scope 服务下的属性有效。

    您可以将其视为“捷径”。

    例如

    $scope.stuff = {}
    
    $scope.$watch('stuff', function(newVal){
     //this is valid because stuff is a property of the $scope object
    })
    

    如果您要查看的属性不是$scope 对象的一部分,您必须注册一个函数作为第一个参数,该函数将在每个摘要周期触发以检查更改。

    为什么需要函数?

    你传递给观察者的函数是一个闭包并且可以访问外部范围,这意味着包括elem在内的所有外部范围变量。

    【讨论】:

    • 这对我有帮助,现在我明白为什么 elem.attr('id') 不起作用,但为什么从函数返回它起作用?编辑:我再次阅读了答案,我想我明白了,基本上它需要一个函数来调用,如果你不包括一个函数,它默认为 $scope?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-03
    • 1970-01-01
    相关资源
    最近更新 更多