Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/21.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 在Angular+中创建隔离作用域的问题;用户界面引导_Javascript_Angularjs_Twitter Bootstrap - Fatal编程技术网

Javascript 在Angular+中创建隔离作用域的问题;用户界面引导

Javascript 在Angular+中创建隔离作用域的问题;用户界面引导,javascript,angularjs,twitter-bootstrap,Javascript,Angularjs,Twitter Bootstrap,我有一个简单的数据表,使用AngularJS创建。表中的一列是根据控制器上的函数计算的 我在页面上有一个按钮,可以打开一个新的模式。当我使用UI引导打开一个模式时,我得到了一个新的隔离作用域(根作用域的子作用域),正如预期的那样。但是,如果模式中有输入文本,则此文本字段中的任何按键都会自动调用父作用域上的函数,即使我可以验证该作用域是隔离的 下面是一个行为的例子: 如示例所示,表的第三列是使用名为“ageNextYear”的函数计算的。在呈现表时,会按预期多次调用此函数(可以在控制台日志中进行验

我有一个简单的数据表,使用AngularJS创建。表中的一列是根据控制器上的函数计算的

我在页面上有一个按钮,可以打开一个新的模式。当我使用UI引导打开一个模式时,我得到了一个新的隔离作用域(根作用域的子作用域),正如预期的那样。但是,如果模式中有输入文本,则此文本字段中的任何按键都会自动调用父作用域上的函数,即使我可以验证该作用域是隔离的

下面是一个行为的例子:

如示例所示,表的第三列是使用名为“ageNextYear”的函数计算的。在呈现表时,会按预期多次调用此函数(可以在控制台日志中进行验证)。但是,如果我打开模式并在字段中键入一些文本,则仍会调用父作用域上的“ageNextYear”函数(在输入字段中键入一些文本并查看控制台日志输出)

我不确定这是故意的行为,还是我做错了什么。我已经尝试在两个作用域上使用点表示法,并显式地将一个新作用域传递给$modal.open,但毫无乐趣

我可以绕过这个问题(通过在“people”上创建一个watchCollection并以这种方式更新表——这可能是一种更好的总体方式),但我想验证其他人是否也看到过这种行为。

Simon, 我喜欢你的问题,我在示波器上添加了watch,看到digest循环被调用

$scope.$watch(函数watchMe(scope){console.log('Digest watched me!');})

以下是带有摘要的叉子。

我不知道这是为什么,但我认为ng repeat中的表达式正在调用摘要,因为它试图对该项上的任何事件的表达式求值

我认为我们应该评估模型中的表达式,并将更新后的模型交给ng repeat来解决问题。

Simon, 我喜欢你的问题,我在示波器上添加了watch,看到digest循环被调用

$scope.$watch(函数watchMe(scope){console.log('Digest watched me!');})

以下是带有摘要的叉子。

我不知道这是为什么,但我认为ng repeat中的表达式正在调用摘要,因为它试图对该项上的任何事件的表达式求值


我认为我们应该评估模型中的表达式,并将更新后的模型交给ng repeat来解决问题。

您遇到的问题与模态对话框的范围无关。该问题与在ng repeat表达式中使用函数有关。一般来说,在表达式中使用函数是一个性能问题,但在ng repeat中这是一个更大的问题。根据这篇关于,

在视图或观察者中使用表达式时,您应该始终记住,每次AngularJS认为需要表达式时都会调用该表达式。使用函数无法获得最佳性能,甚至可能会错过一些更改事件

这意味着一个表达

  • 在ng范围内,将分别为每个项目调用重复。此外,repeat指令还使用它来确定数据更改
  • 可以在一个摘要中多次评估。当您使用多个指令或其他范围观察器时,可能会发生这种情况
  • 即使直接作用域似乎没有改变,也可以进行评估
  • 如果函数的返回值更改,则不会对包含函数的函数进行求值,但仅当函数定义已更改时才会进行求值
  • 您的示例导致出现这4种情况中的3种

  • 对作用域中的每个对象重复函数调用,3个项=3个函数调用
  • 您可以通过调用模态对话框间接添加额外的观察者
  • 对模态对话框范围中的数据的更改会导致对包含ng repeat的控制器范围的评估,即使ng repeat中的数据没有更改(在调用$digest之前,它无法知道数据是否更改)。对模式的每次更改都会导致$digest,这会导致通过ng repeat的另一次行程,以及对ng repeat中的每个项目的另一次调用
  • 在您的情况下,不需要每次计算表达式时都运行逻辑。当逻辑结果发生变化时,最好计算逻辑并将其写入范围。这将使逻辑与对象和视图分离

    总之

    最佳做法:

    • 不要在表达式中使用函数
    • 不要在表达式中使用范围之外的其他数据
    • 应用外部数据更改时,请务必使用$scope.$apply()

    您遇到的问题与模式对话框的范围无关。该问题与在ng repeat表达式中使用函数有关。一般来说,在表达式中使用函数是一个性能问题,但在ng repeat中这是一个更大的问题。根据这篇关于,

    在视图或观察者中使用表达式时,您应该始终记住,每次AngularJS认为需要表达式时都会调用该表达式。使用函数无法获得最佳性能,甚至可能会错过一些更改事件

    这意味着一个表达

  • 在ng范围内,将分别为每个项目调用重复。此外,repeat指令还使用它来确定数据更改
  • 可以在一个摘要中多次评估。当您使用多个指令或其他范围观察器时,可能会发生这种情况
  • 即使直接作用域似乎没有改变,也可以进行评估
  • 如果函数的返回值更改,则不会对包含函数的函数进行求值,但仅当函数定义已更改时才会进行求值