【问题标题】:Wait for child component's update on binding to propagate to the parent in AngularJS等待子组件的绑定更新传播到 AngularJS 中的父组件
【发布时间】:2017-07-24 01:08:56
【问题描述】:

我是 AngularJS 的新手。我正在尝试构建一个用于更新当前页面的分页组件。我遇到的问题是,当组件对具有双向绑定的值进行更改时。新值不会立即提供给父级。

为了等待绑定值更新,我应该做些什么吗?或者这是一个模式问题,我应该采取不同的方法来解决问题?

组件 - paging.js

angular.module('someModule')
.component('paging', {
bindings: {
  page:   '=',
  getNextPage: '='  // <- Side note: This is a function, I had problems using the '&' binding
},
controller: function($scope) {
    var $ctrl = this;

    $ctrl.nextPage = function () {
      $ctrl.page++;
      $ctrl.getNextPage();   // <-- Parent will still have the old value for 'page'

      // THIS WOULD WORK, PARENT WOULD HAVE THE UPDATED VALUE FOR 'page'
      // setTimeout(function(){
      //   $ctrl.action();  
      // }, 1000);

      // COULD ALSO PASS THE VALUE THIS WAY
      // $ctrl.action($ctrl.page); 
    }

});

父控制器

...
  $scope.getNextPage = function () {
      $scope.page; // <- This still has the old value 
      ...
  }

...

【问题讨论】:

    标签: angularjs


    【解决方案1】:

    首先,查看jsFiddle,您可以在其中看到四个不同的页面索引绑定选项。

    检查您发布的代码,我没有发现任何问题,可能您的问题出在 HTML 模板中

    选项1:绑定page变量并在组件内部增加它

    HTML:

    <div ng-controller="parentCtrl">
        <paging page="page"></paging>
    </div>
    

    控制器:

    function parentCtrl($scope) {
        $scope.page = 1;
    }
    

    组件:

    var pagingComponent = {
        bindings: {
            page: '='
        },
        template: '<div><button ng-click="$ctrl.nextPage();">Next Page</button></div>',
        controller: function() {
            var $ctrl = this;
    
            $ctrl.nextPage = function() {
               $ctrl.page++;
            };
        }
    }
    

    选项 2: 绑定 getNextPage() 函数表单父控制器

    HTML:

    <div ng-controller="parentCtrl">
        <paging get-next-page="getNextPage()"></paging>
    </div>
    

    控制器:

    function parentCtrl($scope) {
        $scope.page = 1;
        $scope.getNextPage = function(page) {
            $scope.page++;
        }
    }
    

    组件:

    var pagingComponent = {
        bindings: {
            getNextPage : '&'
        },
        template: '<div><button ng-click="$ctrl.nextPage();">Next Page</button></div',
        controller: function() {
            var $ctrl = this;
    
            $ctrl.nextPage = function() {
               $ctrl.getNextPage();
            };
        }
    } 
    

    【讨论】:

    • 查看您的 jsFiddle,您似乎得出了与我相同的结论? - 这是在子组件中设置新页面然后使新页面立即在父函数中可用的唯一方法是将新页码作为参数传递。在您的其他示例中,看起来您实际上是在增加父级中的页码。
    • 我同意你的结论。您必须将$scope.page 变量传递给子组件...可能还有其他方法可以做到这一点,但我认为这是一种明确的方法。无论如何,如果某些选项不能解决您的问题,请告诉我,我可以更新我的 jsFiddle 或我的答案。 --- 祝你好运:)
    猜你喜欢
    • 2020-08-19
    • 1970-01-01
    • 2018-11-18
    • 1970-01-01
    • 2018-07-09
    • 2016-02-17
    • 2017-05-20
    • 2018-04-18
    • 1970-01-01
    相关资源
    最近更新 更多