【问题标题】:How do I $watch multiple interpolated attributes in a directive?如何 $watch 指令中的多个插值属性?
【发布时间】:2012-10-19 14:02:14
【问题描述】:

我不明白如何在链接函数中同时观察多个属性,所以我创建了一个包含所有参数的对象并观察它。但我注意到链接函数中的属性是字符串而不是对象,所以我使用的是 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>

我认为我必须使用 $watch

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

【问题讨论】:

    标签: javascript angularjs angularjs-directive


    【解决方案1】:

    我不确定我是否完全理解你的问题,所以如果我误解了,请纠正我。只是想从指令的多个属性中提取值吗?所以假设你有一个这样的 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;
    }
    

    您还可以使用指令上的范围属性自动将属性绑定到您的范围。有关指令,请参阅 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
            }
        });
    }
    

    如果您想将对象绑定到您的作用域中,您可以使用“=”而不是“@”。另一个选项是“&”,它评估父范围内的函数。这在上面链接的指令文档中都有解释。

    【讨论】:

    • 感谢 dnc253;但我需要绑定参数,所以我想我必须使用 scope.$watch;但我不知道如何查看多个参数。我编辑了问题。
    • 我更新了我的答案。如果我仍然不了解您的问题,请告诉我。
    • 是的,这就是我要找的东西,但我不明白如何同时使用所有这些功能。你能写一个例子吗?谢谢
    • 好的,我想我明白了。你的意思是这样的吗? jsfiddle.net/rvd6x/3
    • 我在答案中添加了另一个示例。在您的小提琴中,您需要确保在尝试使用 prop1 之前定义它。它可以在定义之前进入那里。
    猜你喜欢
    • 1970-01-01
    • 2013-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-29
    • 1970-01-01
    • 1970-01-01
    • 2020-08-30
    相关资源
    最近更新 更多