AngularJS覆盖独立的指令范围

AngularJS覆盖独立的指令范围,angularjs,scope,directive,Angularjs,Scope,Directive,用法: 控制台输出 app.directive('myDirective', [ function () { var definition = { restrict: "E", replace: false, transclude: false, scope: { myVar: '@', }, co

用法:

控制台输出

app.directive('myDirective', [
    function () {
        var definition = {
            restrict: "E",
            replace: false,
            transclude: false,
            scope: {
                myVar: '@',
            },
            controller: ['$scope', function($scope) {
                console.log($scope.myVar); // "true"
                $scope.myVar = "false";
                console.log($scope.myVar); // "false"

                setTimeout(function() {
                    console.log($scope.myVar); // "true" (!)
                }, 100);
            }]
        };

        return definition;
    }
]);
这里到底发生了什么?变量作为字符串(“true”)传递,我正在更改它,然后它又被替换了?我想了解这里的循环。这是因为有一些额外的编译或摘要周期进入并再次重新计算所有隔离的作用域值吗?我认为一旦设置,像这样传递的变量(@,只是指令中的字符串)将保持不变


是否有任何方法可以在指令中连接到某个时刻,在该时刻之后字符串变量不会被替换,或者在每个摘要或诸如此类的情况下它总是这样工作,并且我被迫使用$watch?

@
将父范围绑定到隔离范围,它是单向(而不是一次性)绑定。因此,外部范围中的任何更改都将重置指令隔离范围中的值

,在带有“@”的元素属性上,角度调用attrs.$observe。这样做的目的是,在编译后的下一个$digest循环中将观察者函数排队。每次指定给属性的插值发生变化时,该观察者函数都会设置范围变量

因此,高级步骤是:

"true"
"false"
"true"
所以,考虑到这一点,你现在可以明白为什么你的改变没有持续下去。如果您在所有这些步骤之后完成了,即超时或响应事件,则会发生这种情况。仅当属性插值未更改时

=
”的情况并非如此

这里有一个例子来说明不同之处

如果希望一次性传递变量,只需使用链接函数或控制器中的属性设置范围变量

1) for `@` scope variable, set an observer function and queue it for later
2) set `@` scope variable to the interpolated value
3) run the controller, pre- and post-link functions
...
N) observer runs against interpolated value and sets the scope value

并将
myVar
从范围中删除。

这与类似的问题有关,但我发现原始答案并不完整,因为我使用eval将这些字符串重新计算为布尔值,并不真正想更改它们的值,而是想使它们保持布尔值。所以我把一个转换成布尔值,然后它又被重写成字符串。你还想要什么?它回答了你的问题。为什么会改变因为它是单向绑定,即父范围变量的任何更改都将导致绑定范围变量的更改。在你的问题中,你做了一个错误的假设,认为它不会。我知道这是有约束力的。我不知道(也不想知道)到底是什么触发了摘要循环的重新评估,从而使它再次填充新对象,即使它之前填充过,并且它的值没有改变。这些都是深层次的内部事务。$摘要周期在任何组件调用时都会启动。$范围。$应用。它在第一次运行时也会在层次结构中上下移动。如果您知道绑定,那么您就知道它是使用脏检查完成的-因为您在重新应用绑定的两次运行之间更改了值。看到我自己的问题了吗?是的,我也知道,谢谢。关键是,值在所有初始化之后很长时间都会更改。据我所知,网站上没有任何其他组件也会强制进行任何新的摘要,但其价值会发生变化,因此必须有一些东西。我想知道它可能是什么,但也许这个问题毕竟太模糊了。不模糊。我做了一些实验,但并不是所有的事情都像我想象的那样,所以我必须仔细研究Angular的代码。我更新了答案。
1) for `@` scope variable, set an observer function and queue it for later
2) set `@` scope variable to the interpolated value
3) run the controller, pre- and post-link functions
...
N) observer runs against interpolated value and sets the scope value
scope.myVar = $attrs["my-var"];