【问题标题】:Angular JS - declaring function inside ng-init?Angular JS - 在ng-init中声明函数?
【发布时间】:2016-06-22 07:40:25
【问题描述】:

我有几个问题。请在下面找到它们 -

1) 在 ng-init 中定义的函数,如下所示

ng-init='function a() {}'

错误。将语法更改为变量声明类型或即时调用也不起作用。为什么?因为我们无论如何都可以声明一个变量、对象、数组。为什么不是函数?

2) $watch 是为绑定到范围的所有变量创建的,还是只为视图中显示的那些范围变量创建?

3) 如果您运行 fiddle 'http://jsfiddle.net/Lvc0u55v/5753/',则会出现 >10 $digest 迭代错误。这是意料之中的。现在请按照小提琴中给出的评论和取消评论。没有错误,怎么会?这里$scope.a的值也是无限变化的吧?

【问题讨论】:

    标签: javascript angularjs angularjs-digest angularjs-ng-init


    【解决方案1】:

    让我试着回答你的问题。

    1) 据我所知ng-init 不应该与函数表达式一起使用。它更用于处理逻辑表达式。你可以看看docs,它也被指出了,包括一个简短的例子。正如文档所说:

    ngInit 指令允许您在 当前范围。

    2) 通常,$watch 不会绑定到作用域的每个变量(即使它可以绑定到整个摘要循环)。正如您在示例中所做的那样,您已将$watch 绑定到名为a 的范围变量。因此,每次您的 $scope.a 变量更改时都会触发。您也可以在这里查看docs

    3) 关于这个问题,答案很简单。假设我们从$scope.a = 10 开始(正如您已经完成的那样)。在你运行你的应用程序的那一刻,你的$watch 会非常火爆。这样做,您将获得以下信息:

    nv = 10;
    ov = 10;
    $scope.a = ov * 9;
    

    假设你的$scope.a 现在是90,这显然会再次解雇你的观察者。这次有以下内容:

    nv = 90;
    ov = 10;
    $scope.a = ov * 9;
    

    现在,此时您的新值与以前相同。在这个速率下,您的观察者不会再次触发,因为值不会改变(因为它与以前完全相同)。

    另一方面,运行$scope.a = nv * 9 将始终更新$scope.a 并且 将导致无限循环。

    我希望这会有所帮助。

    【讨论】:

    • 对于第 2 点,如果我在控制器中声明了一个变量 $scope.b 并且没有像 {{b}} 那样绑定到视图,那么观察者是否绑定到“b”?跨度>
    • 不,不是。观察者只是一个可以绑定到特定对象的侦听器。您可以通过 $scope.$watch(OBJECT-HERE, ...) 来实现这一目标。在您的小提琴中,您通过将“a”添加到您的观察者中,将观察者绑定到您非常具体的 $scope.a 变量。
    • 哦,k...我没有明确询问,这很糟糕。请参考 jsfiddle - jsfiddle.net/Lvc0u55v/5762。在这段代码中,没有明确的观察者。但是 Angular 会添加观察者,对吗?所以我的问题是观察者是否会仅通过角度添加到变量“名称”和“公司”甚至“年龄”?希望我更清楚。
    • 我猜你的问题是关于花括号 {{ }},对吗?这是 Angulars 的两种数据绑定方式。基本上,这不是像 $watch 这样的“观察者”。双向数据绑定只是打印出变量内部值的一种方式(在您的情况下,现在是名称和公司)。这样做,Angular 会在内部将一个观察者附加到你的变量,以便它可以解析它们的结果并相应地更新你的视图。
    • 我非常接近答案 :) 所以从你的回答中,我知道角度内部将观察者与名称和公司联系起来,酷!现在我们错过的另一个问题是,是否将内部观察者添加到“年龄”,因为它在范围内,但不在视图中?
    猜你喜欢
    • 1970-01-01
    • 2014-07-18
    • 2016-07-01
    • 1970-01-01
    • 2016-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-27
    相关资源
    最近更新 更多