我想观察字典中的变化,但由于某种原因,手表回调没有被调用。

这是我使用的一个控制器:

function MyController($scope) {
    $scope.form = {
        name: 'my name',
        surname: 'surname'
    }

    $scope.$watch('form', function(newVal, oldVal){
        console.log('changed');
    });
}

这是小提琴。

我期望$watch回调在每次更改姓名或姓氏时被触发,但它没有发生。

正确的做法是什么?

既然已经消除了$broadcast和$emit之间的性能差异,那么是否有理由偏爱$scope呢?$emit到$rootScope.$broadcast?

是的,他们是不同的。

$emit仅限于作用域层次结构(向上)——如果它适合您的设计,这可能很好,但在我看来这是一个相当武断的限制。

rootScope美元。$broadcast适用于所有选择收听事件的人,在我看来,这是一个更合理的限制。

我遗漏了什么吗?

编辑:

澄清一下,派遣的方向不是我所关注的问题。美元的范围。$emit向上分派事件,而$scope。$broadcast -向下。但是为什么不总是使用$rootScope呢?$broadcast能达到所有目标听众?

我用data-ng-controller="xyzController as vm"设置了我的控制器

我有一个父/子嵌套控制器的场景。我没有问题通过使用$parent.vm访问嵌套html中的父属性。属性,但我不知道如何从我的子控制器访问父属性。

我尝试注入$scope,然后使用$scope.$parent.vm。财产,但这样不行吗?

有人能给点建议吗?

我发现自从在angular中构建应用程序以来,我越来越需要手动将页面更新到我的范围。

我知道的唯一方法是从控制器和指令的范围调用$apply()。这样做的问题是,它不断向控制台抛出一个错误,错误如下:

错误:$digest已在进行中

有人知道如何避免这种错误或以不同的方式实现相同的事情吗?

在AngularJS主页的“创建组件”部分,有这样一个例子:

controller: function($scope, $element) {
  var panes = $scope.panes = [];
  $scope.select = function(pane) {
    angular.forEach(panes, function(pane) {
      pane.selected = false;
    });
    pane.selected = true;
  }
  this.addPane = function(pane) {
    if (panes.length == 0) $scope.select(pane);
    panes.push(pane);
  }
}

注意select方法是如何添加到$scope的,而addPane方法是添加到this的。如果我把它改成$scope。addPane,代码崩溃。

文档说实际上是有区别的,但它没有提到区别是什么:

以前的Angular版本(1.0 RC之前)允许你将此方法与$scope方法互换使用,但现在不再是这样了。在作用域上定义的方法内部this和$scope是可以互换的(angular将this设置为$scope),但在控制器构造函数内部则不能互换。

this和$scope在AngularJS控制器中是如何工作的?

我已经仔细阅读了AngularJS关于这个主题的文档,然后摆弄了一个指令。这是小提琴。

以下是一些相关片段:

来自HTML: <窗格bi-title = "标题" title =“{{标题}}>{{文本}}> < /窗格 从窗格指令: scope: {biTitle: '=', title: '@', bar: '='},

有几件事我不明白:

为什么我必须使用“{{title}}”与“@”和“title”与“=”? 我也可以直接访问父范围,而不装饰我的元素与属性? 文档说:“通常情况下,通过表达式将数据从孤立的作用域传递到父作用域是可取的”,但这似乎也适用于双向绑定。为什么表达式路由会更好呢?

我发现另一个小提琴,显示表达式解决方案太:http://jsfiddle.net/maxisam/QrCXh/

我不知道如何使用$scope。$watch和$scope.$apply。官方文件没有帮助。

我不太明白的是:

它们是否连接到DOM? 如何将DOM更改更新到模型? 它们之间的连接点是什么?

我尝试了本教程,但它认为理解$watch和$apply是理所当然的。

$apply和$watch做什么,如何适当地使用它们?

我想访问我的$范围变量在Chrome的JavaScript控制台。我怎么做呢?

我既不能看到$scope也不能看到我的模块myapp的名称在控制台中作为变量。