Javascript {{}内的值未按角度更新

Javascript {{}内的值未按角度更新,javascript,angularjs,angularjs-scope,angularjs-digest,Javascript,Angularjs,Angularjs Scope,Angularjs Digest,我们使用嵌套角度指令的功能。我添加了一个可以观察到行为的简化示例 以下是HTML: <body ng-app="myapp"> <div> This is the first directive <first-directive my-val="9"> </first-directive> </div> </body> 这是第一条指令 还有JavaScri

我们使用嵌套角度指令的功能。我添加了一个可以观察到行为的简化示例

以下是HTML:

<body ng-app="myapp">
    <div>
        This is the first directive
        <first-directive my-val="9">
        </first-directive>
    </div>
</body>

这是第一条指令
还有JavaScript:

var app = angular.module("myapp",[]);
app.directive("firstDirective",function(){
    return {
            template:'<second-directive val-new={{myVal}}></second-directive>',
            scope:{
                myVal:'@'
            },
            //transclude:true,
            link: {
                pre:function(scope,elem,attr){
                        scope.myVal=scope.myVal+"1";
                    }
            }
    }
});

app.directive("secondDirective",function(){
    return{
        scope:{
            valNew:'@'
        },

        link:{
            pre:function(scope,elem,attr){
                    console.log(scope.valNew);
                }
        }
    }
});
var-app=angular.module(“myapp”,[]);
app.directive(“firstDirective”,function(){
返回{
模板:“”,
范围:{
myVal:“@”
},
//是的,
链接:{
前置:功能(范围、要素、属性){
scope.myVal=scope.myVal+“1”;
}
}
}
});
app.directive(“secondDirective”,function()){
返回{
范围:{
valNew:“@”
},
链接:{
前置:功能(范围、要素、属性){
console.log(scope.valNew);
}
}
}
});
在控制台中,我得到pre方法中的更新结果,但在html中,我得到旧值

控制台打印:“91” html dom包含:

    <second-directive val-new="9" class="ng-isolate-scope"></second-directive>>
>
请帮助我理解为什么会观察到这种差异,以及如何使这两个地方保持一致

编辑
我只是在寻找一种方法,使第二个指令中的范围变量对第一个指令范围中的链接变量所做的更改做出反应。因此,在另一个地方,当
myVal
发生变化时,我希望第二个指令对这些变化做出反应。

问题在于,您只为值传递变量,而不是使用“@”传递变量 如果将其替换为“=”,则它们将作为变量传递并更新

所以,用这种方式更改代码

app.directive("firstDirective",function(){
    return {
            template:'<second-directive val-new="myVal"></second-directive>',
            scope:{
                myVal:'='
            },
            //transclude:true,
            link: {
                pre:function(scope,elem,attr){
                        scope.myVal=scope.myVal+"1";
                    }
            }
    }
});

app.directive("secondDirective",function(){
    return{
        scope:{
            valNew:'='
        },

        link:{
            pre:function(scope,elem,attr){
                    console.log(scope.valNew);
                }
        }
    }
});
app.directive(“firstDirective”,function()){
返回{
模板:“”,
范围:{
myVal:“=”
},
//是的,
链接:{
前置:功能(范围、要素、属性){
scope.myVal=scope.myVal+“1”;
}
}
}
});
app.directive(“secondDirective”,function()){
返回{
范围:{
valNew:“=”
},
链接:{
前置:功能(范围、要素、属性){
console.log(scope.valNew);
}
}
}
});

将计算移动到模板:

var app = angular.module("myapp",[]);
app.directive("firstDirective",function(){
    return {
            ̶t̶e̶m̶p̶l̶a̶t̶e̶:̶'̶<̶s̶e̶c̶o̶n̶d̶-̶d̶i̶r̶e̶c̶t̶i̶v̶e̶ ̶v̶a̶l̶-̶n̶e̶w̶=̶{̶{̶m̶y̶V̶a̶l̶}̶}̶>̶<̶/̶s̶e̶c̶o̶n̶d̶-̶d̶i̶r̶e̶c̶t̶i̶v̶e̶>̶'̶
            template:'<second-directive val-new="{{myVal+'1'}}"></second-directive>',
            scope:{
                myVal:'@'
            },
            //transclude:true,
            link: {
                pre:function(scope,elem,attr){
                    ̶s̶c̶o̶p̶e̶.̶m̶y̶V̶a̶l̶=̶s̶c̶o̶p̶e̶.̶m̶y̶V̶a̶l̶+̶"̶1̶"̶;̶
                }

            }
    }
});
var-app=angular.module(“myapp”,[]);
app.directive(“firstDirective”,function(){
返回{
"t,e,m,p,l,a,t,e:""
模板:“”,
范围:{
myVal:“@”
},
//是的,
链接:{
前置:功能(范围、要素、属性){
"s,c,o,p,e","m,y,V,a,l","s,c,o,p,e","m,y,V,a,l"1"
}
}
}
});

属性(
“@”
)绑定创建一个监视程序,该监视程序在每个摘要周期将值从模板复制到隔离作用域。preLink函数中的
scope.myVal
修改在下一个摘要循环中被观察者覆盖。

我尝试了您建议的代码,第二个指令被创建为
,在第二个指令中,您必须将其用作普通变量!不是val new=“{myVal}}”,而是val new=“myVal”错误:[$compile:nonassign]与指令“firstDirective”一起使用的属性“myVal”中的表达式“9”是不可赋值的@georgeawg代替9你必须使用一个变量,如果你想在第一个指令中使用一个数字改成“@”SamGhatak,你能给我一个反馈吗?你试过了吗?我没有投反对票,但我可以看出这个问题对其他读者没有用处。为什么任何指令都需要修改preLink函数中的作用域?那么,为什么有人会关心它引起的任何问题呢?请不要误解,伙计,你试图帮助回答这个问题,但因为有人投了反对票,我只是说投了反对票的帖子应该让用户知道他犯了什么错,这当然可能是我问了一个愚蠢的问题,但是仅仅通过否决投票并不能帮助我理解我的错误,对吗?…事实上情况很复杂,我试图对这个问题发表一个最低限度的、可核实的参考。