将对象传递给指令而不看它们

时间:2015-09-26 06:53:54

标签: angularjs angularjs-directive

通常我们在创建指令时使用=进行双向数据绑定,例如:

app.module('main')
    .directive('dirTest'[function(){
        return {
            scope:{
                data:'='
            }
        }
    }])

然后我们可以使用

<dir-test data="xx.data"></dir-test>

要将xx.data对象传递给指令,但似乎这将使角度观察此表达式。

一旦我不关心数据的变化或数据几乎无法改变,这可能是浪费时间。

这意味着我需要将单向一次性数据传递给指令,这可能吗?

我问这个问题是因为当我打开Batarang控制台时,我发现regularinterceptedexpression费用太长,看了很多观察者。我认为如果我可以删除一些未使用的观察者,页面可能会运行得很快。

我知道使用@有从dom到指令的单向,但它似乎只支持字符串。

3 个答案:

答案 0 :(得分:2)

在angularjs中,如果你创建一个范围为'@'的指令,那么它将是Text绑定,这意味着你将能够获得表达式的值但是对它进行更改将不会反映回html page.so我相信如果您使用范围@创建指令,那么它将为您完成工作。

app.module('main')
    .directive('dirTest'[function(){
        return {
            scope:{
                data:'@'
            }
        }
    }]

<dir-test data={{xx.data}}></dir-test>

答案 1 :(得分:1)

但是,您可能需要自己评估data属性并克隆对象。此评估的范围将为scope.$parent,因为这是数据来源的范围。如果您的指令不需要隔离范围(因此您不在指令中使用scope配置),则应在scope中评估该属性:

.directive('dirTest', [function() {
    return {
        scope: {
            something: '=' // something that might need two-way binding
        },
        link: function(scope, element, attrs) {
            scope.data = angular.copy(scope.$parent.$eval(attrs.data));
        }
    }
}]);

演示: http://plnkr.co/edit/nDzqWaVH9QkluFJknOfy?p=preview

答案 2 :(得分:0)

您可以使用Angular的一次性绑定:

<dir-test data="::xx.data"></dir-test>

请注意,它在Angular 1.3+中可用。有关详细信息,请查看此文章:http://blog.thoughtram.io/angularjs/2014/10/14/exploring-angular-1.3-one-time-bindings.html