2012-10-19 51 views
8

我不明白如何在链接功能中同时观看多个属性,所以我创建了一个包含所有参数的对象,并且我注意到了它。但我注意到链接函数中的属性是一个字符串,而不是一个对象,所以我使用angular.fromJson(val)。如何在指令中观察多个插值属性?

All the example I found just use one parameter

你能解释一下如何观看多个属性?

感谢

编辑: 因为我需要绑定的属性,我不能使用的attrs参数 - 即它们需要插值。例如

<ul class="thumbnails"> 
    <li class="span3" ng-repeat="image in currentSizeInfo.images" > 
     <upload-file info = "{{getInfo($index)}}" foo="foo$index" ></upload-file> 
    </li> 
</ul> 

我认为我必须使用$看

link:function (scope, element, attrs) { 
    scope.$watch('info', function (val) { 
    // if info is and foo is .... do all the stuff 
    }) 
} 

回答

11

我不知道我完全理解你的问题,所以请纠正我,如果我误解。只想从您的指令的多个属性中提取值?所以说你有这样的HTML:

<my-directive attr1="data1" attr2="data2" attr3="data3" /> 

而你想获得这些不同属性的值?在链接功能中,您只需使用attrs参数。例如:

link: function(scope, element, attrs) { 
    var foo1 = attrs.attr1; 
    var foo2 = attrs.attr2; 
    var foo3 = attrs.attr3; 
} 

您也可以使用指令的scope属性自动将属性绑定到您的范围。有关指令,请参阅their documentation。所以,这样的事情:

scope: { 
    attr1: '@', 
    attr2: '@', 
    attr3: '@' 
} 

,然后将这些属性在你的范围最终自动。但是,as I found out,这些值并不总是在您预期的范围内。所以你可以使用$watch函数来做你需要的东西。喜欢的东西:

link: function(scope, element, attrs) { 
    scope.$watch("attr1", function() { 
     if (scope.attr1) 
     { 
       //stuff with attr1 
     } 
    } 
    scope.$watch("attr2", function() { 
     if (scope.attr2) 
     { 
       //stuff with attr2 
     } 
    } 
    //.... 
} 

如果您需要在同一时间同时使用所有这些,你可以使用一个功能,一旦他们都在那里,然后,将是不同的,它返回一个字符串$watch的第一个参数把你的逻辑放在第二个参数的函数中。所以像这样:

link: function(scope, element, attrs) { 
    scope.$watch(function() { 
     if (scope.attr1 && scope.attr2 && scope.attr3) 
     { 
      return "allSet"; 
     } 
     else 
     { 
      return ""; 
     } 
    }, function (newVal) { 
     if ("allSet" == newVal) 
     { 
      //do stuff with all the properties 
     } 
    }); 
} 

如果你想要将对象绑定到你的作用域,你可以使用'='而不是'@'。另一种选择是'&',它评估父范围中的函数。这在上面链接的指令文档中有所解释。

+0

谢谢dnc253;但我需要绑定参数,所以我认为我必须使用范围。但我不知道如何观看多个参数。我编辑了这个问题。 – heckmac

+0

我更新了我的答案。如果我仍然不了解你的问题,请告诉我。 – dnc253

+0

是的,这是我正在寻找,但我不明白如何做的功能,同时使用所有它们。你能写一个例子吗?谢谢 – heckmac