Javascript AngularJs指令链接函数无法更改控制器中定义的变量';s范围
我正在尝试创建一个带有链接函数的指令,它可以在其中更改作用域(即输入标记)中的“varName”。注意,指令模板与控制器中的“varName”相同&未使用scope属性 发生的情况如下: 案例1:如果单击自定义元素,将调用$scope中定义的“runFn”函数,但是“varName”没有更改 案例2:如果单击div标记,“runFn”函数也会被调用,“varName”会被更改 我尝试了3种方法,但似乎无法让link函数更改“varName”值。有人能解释一下为什么n提供了一个解决方案吗?谢谢 代码:Javascript AngularJs指令链接函数无法更改控制器中定义的变量';s范围,javascript,angularjs,angularjs-scope,Javascript,Angularjs,Angularjs Scope,我正在尝试创建一个带有链接函数的指令,它可以在其中更改作用域(即输入标记)中的“varName”。注意,指令模板与控制器中的“varName”相同&未使用scope属性 发生的情况如下: 案例1:如果单击自定义元素,将调用$scope中定义的“runFn”函数,但是“varName”没有更改 案例2:如果单击div标记,“runFn”函数也会被调用,“varName”会被更改 我尝试了3种方法,但似乎无法让link函数更改“varName”值。有人能解释一下为什么n提供了一个解决方案吗?谢谢 代
单击以获取新值
window.onload=(函数(){
“严格使用”;
var app=angular.module('moduleA',[]);
应用控制器(“ctrlA”,功能($scope){
$scope.varName=“旧值”;
$scope.runFn=函数(){
$scope.varName=“新值”;
console.log(“runfn”);
};
});
应用程序指令(“自定义”,函数(){
返回{
限制:“E”,
模板:“{{varName}}”,
替换:正确,
链接:功能(s、e、a){
e、 在(“单击”,函数(){
s、 varName=“new value”;//不起作用
s、 runFn();//不起作用
s、 runFn.call;//不起作用
});
}
};
});
})(); // 结束窗口加载
我认为您忘记的只是在进行更新时调用$apply以确保用户界面得到更新
e.on("click", function(){
//Call $apply to ensure a $digest loop
// get's kicked off
s.$apply(function(){
s.varName = "new value";
});
});
您在中的单击功能在角度之外执行。您需要以角度方式处理单击事件。按如下方式更改您的指令
app.directive("custom", function(){
return {
restrict: "E",
template: '<div ng-click="divClick()">{{varName}}</div>',
replace: true,
link: function(s, e, a){
s.divClick = function(){
s.varName = "new value";
s.runFn();
s.runFn.call(s);
}
}
};
});
app.directive(“自定义”,函数(){
返回{
限制:“E”,
模板:“{{varName}}”,
替换:正确,
链接:功能(s、e、a){
s、 divClick=function(){
s、 varName=“新值”;
s、 runFn();
s、 运行fn.呼叫;
}
}
};
});
谢谢。我以为链接fn会自动更新。只是想知道是否有任何方法可以从链接函数的角度简化整体语法?我的意思是指令中嵌套了3个函数,链接函数中嵌套了2个。@Charles-我知道它看起来有点笨拙,但指令毕竟是低级的。它们旨在对应用程序代码隐藏所有讨厌的DOM操作。这实际上取决于你在指令中所做的事情,它将决定它有多复杂。如果太复杂,你可以使用指令控制器。也许这就是AngularJS“固执己见”的地方根据我的经验,我的大部分时间都花在适应代码组织的“习惯”上,而不是功能上。@Charles-我不是你所说的代码组织的100%。您的控制器和服务实际上是业务功能所在的地方。如果您需要做更高级的DOM工作,那么您可以将其放入一个指令中,并让数据绑定处理其余的工作。您需要学习angular如何工作的核心概念,例如(依赖项注入、摘要循环、范围)。在我看来,一旦你做到了这一点,Angular就可以更快地构建应用程序。
app.directive("custom", function(){
return {
restrict: "E",
template: '<div ng-click="divClick()">{{varName}}</div>',
replace: true,
link: function(s, e, a){
s.divClick = function(){
s.varName = "new value";
s.runFn();
s.runFn.call(s);
}
}
};
});