Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/375.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.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表达式本地计算值的函数是否非常糟糕?_Javascript_Html_Angularjs_Angularjs Scope - Fatal编程技术网

Javascript 调用从AngularJS表达式本地计算值的函数是否非常糟糕?

Javascript 调用从AngularJS表达式本地计算值的函数是否非常糟糕?,javascript,html,angularjs,angularjs-scope,Javascript,Html,Angularjs,Angularjs Scope,我已经读过了,它声明不应该在表达式中使用函数,我理解每次框架认为需要表达式时(这种情况可能会经常发生),都可能会对表达式进行求值,反复调用昂贵的函数将是低效的。但是,如果该函数仅根据已加载到范围中的值进行一些计算,该怎么办?例如,假设我有一个具有3个不同属性的作用域,并且一些状态由这些属性的值的组合决定。我可以在函数中计算该状态: $scope.state = function() { return prop1 && prop2 && prop3; };

我已经读过了,它声明不应该在表达式中使用函数,我理解每次框架认为需要表达式时(这种情况可能会经常发生),都可能会对表达式进行求值,反复调用昂贵的函数将是低效的。但是,如果该函数仅根据已加载到范围中的值进行一些计算,该怎么办?例如,假设我有一个具有3个不同属性的作用域,并且一些状态由这些属性的值的组合决定。我可以在函数中计算该状态:

$scope.state = function() {
    return prop1 && prop2 && prop3;
};
并从表达式中调用该函数。另一种方法是在每次更改每个属性时调用该函数,以便缓存状态值:

$scope.prop1 = someValue;
$scope.state = getState();
...
$scope.prop2 = someOtherValue;
$scope.state = getState();
...
$scope.prop3 = yetAnotherValue;
$scope.state = getState();

在这种情况下,直接从表达式调用函数真的那么糟糕吗?如果是这样,是否是缓存计算值的唯一替代方法,可能在许多不同的位置,或者是否缺少其他方法?

一个选项是在状态条件下设置
$watch
<代码>$watch可以获取函数参数,因此您可以执行以下操作:

$scope.$watch(function(){
    return $scope.prop1 && $scope.prop2 && $scope.prop3;        
},function(val){
    $scope.state = val;
});

一个选项是在状态条件下设置
$watch
<代码>$watch可以获取函数参数,因此您可以执行以下操作:

$scope.$watch(function(){
    return $scope.prop1 && $scope.prop2 && $scope.prop3;        
},function(val){
    $scope.state = val;
});
不,没那么糟

在表达式中不使用函数会导致HTML因内联javascript而膨胀

考虑一下这段代码的优雅:

需要名字!
...
姓是必需的!
...
电子邮件是必需的!
与此相比:

需要名字!
...
姓是必需的!
...
电子邮件是必需的!
函数Ctrl($scope){
$scope.isInvalid=函数(字段){
返回($scope.form[field].$dirty | |$scope.submitted)和&$scope.form[field].$error.required;
};
$scope.submit=函数(){
$scope.submitted=true;
//$http.post。。。
}
}
即使是在表达式中使用函数的作者

表达式中的函数在Angular中是受欢迎的,但有以下前瞻性:

  • 函数应该是“轻的”(用计算术语)
  • 对于相同的输入,函数应该返回相同的输出
  • 函数应该是自包含的(它们不应该影响其他作用域成员),因为否则它们可能会创建$digest循环
  • 函数应该是可缓存的(如果可能)
  • 不,没那么糟

    在表达式中不使用函数会导致HTML因内联javascript而膨胀

    考虑一下这段代码的优雅:

    需要名字!
    ...
    姓是必需的!
    ...
    电子邮件是必需的!
    
    与此相比:

    需要名字!
    ...
    姓是必需的!
    ...
    电子邮件是必需的!
    
    函数Ctrl($scope){
    $scope.isInvalid=函数(字段){
    返回($scope.form[field].$dirty | |$scope.submitted)和&$scope.form[field].$error.required;
    };
    $scope.submit=函数(){
    $scope.submitted=true;
    //$http.post。。。
    }
    }
    
    即使是在表达式中使用函数的作者

    表达式中的函数在Angular中是受欢迎的,但有以下前瞻性:

  • 函数应该是“轻的”(用计算术语)
  • 对于相同的输入,函数应该返回相同的输出
  • 函数应该是自包含的(它们不应该影响其他作用域成员),因为否则它们可能会创建$digest循环
  • 函数应该是可缓存的(如果可能)

  • 我不知道你可以用
    $watch
    来做这件事。美好的我不知道你可以用
    $watch
    来做这件事。美好的基本上概括了我的想法。谢谢基本上概括了我的想法。谢谢