【问题标题】:Angular.js two-way binding do not work when update the $scope in the controller of custom directive?更新自定义指令控制器中的 $scope 时,Angular.js 双向绑定不起作用?
【发布时间】:2014-11-03 20:55:04
【问题描述】:

我在编写一组可以相互联系的指令时遇到了这个问题。

这里是 CodePen 网址:http://codepen.io/jennieji/pen/mDGuw

这里是JS代码:

angular.module('app', [])
.directive('testDirective', function() {
  return {
    controller: function($scope){
      $scope.now = 0;

      this.update = function() {
        $scope.now++;
      };
    },
    link: function(scope) {
      scope.$watch(function(){
        return scope.now;
      }, function(newVal, oldVal) {
        element.append('<p>[LOG] $watch now:' + newVal + '</p>');
      }, true);
      scope.$watch('now', function(newVal, oldVal) {
        element.append('<p>[LOG] $watch now:' + newVal + '</p>');
      });
    }
  };
})
.directive('testUpdate', function() {
  return {
    require: '^testDirective',
    link: function(scope, element, attr, ctrl) {
      element.on('click', function(){
        ctrl.update();
        element.after('<p>[LOG] click now:' + scope.now + '</p>');
      });
    }
  }
});

这里是 HTML:

<div ng-app="app">
  <div test-directive>
    <p>{{ now }}</p>
    <button test-update>Update now</button>
  </div>
<div>

【问题讨论】:

    标签: javascript angularjs angularjs-directive angularjs-scope watch


    【解决方案1】:

    因为你正在监听 DOM 点击事件:

    element.on('click', function(){

    除非您$apply 他们,否则您的范围更改不会生效:

    link: function(scope, element, attr, ctrl) {
          element.on('click', function(){
    
            scope.$apply(function() {
              ctrl.update();
            });
            ctrl.update();
            element.after('<p>[LOG] click now:' + scope.now + '</p>');
    
          });
        }
    

    $apply 启动 Angular $digest 循环并对双向绑定进行脏检查。

    【讨论】:

    • 双向绑定有效!但是 $watch 还是不行,为什么?
    • 不确定控制器范围是否与链接范围相同。您可能需要先确认一下。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 2016-12-29
    • 2015-03-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多