Angularjs 将对象传递给指令而不监视它们

Angularjs 将对象传递给指令而不监视它们,angularjs,angularjs-directive,Angularjs,Angularjs Directive,通常,我们在创建指令时使用=进行双向数据绑定,例如: app.module('main') .directive('dirTest'[function(){ return { scope:{ data:'=' } } }]) 然后我们可以使用 <dir-test data="xx.data"></dir-test> 将xx.data对象传

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

app.module('main')
    .directive('dirTest'[function(){
        return {
            scope:{
                data:'='
            }
        }
    }])
然后我们可以使用

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

xx.data
对象传递给指令,但这似乎会使angular监视此表达式

一旦我不在乎数据的变化,或者数据几乎不能改变,这可能是浪费时间

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


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


我知道使用
@
可以实现从dom到指令的单向转换,但它似乎只支持字符串。

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

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


请注意,它在Angular 1.3+中可用。查看本文了解更多详细信息:

这是可能的,但是您需要评估
数据
属性并自己克隆对象。此评估的范围将是
scope.$parent
,因为这是数据来源的范围。如果您的指令不需要隔离作用域(因此您不在指令中使用
scope
config),则应在
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));
        }
    }
}]);

演示:

在angularjs中,如果创建范围为“
@”
的指令,则它将是文本绑定,这意味着您将能够获得表达式的值,但对其进行更改不会反映回html页面。因此,我相信,如果您使用scope
@
在中创建指令,那么它将为您完成任务

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



在这种情况下,不幸的是
不会有帮助,因为在指令作用域配置的情况下,双向绑定的设置是不同的。这里有一个演示:这是正确的答案。OP犯的错误是认为只能向'@'指令作用域属性提供字符串。
<dir-test data={{xx.data}}></dir-test>