Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript AngularJs指令链接函数无法更改控制器中定义的变量';s范围_Javascript_Angularjs_Angularjs Scope - Fatal编程技术网

Javascript AngularJs指令链接函数无法更改控制器中定义的变量';s范围

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提供了一个解决方案吗?谢谢 代

我正在尝试创建一个带有链接函数的指令,它可以在其中更改作用域(即输入标记)中的“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);  
            }
        }
    };
});