Angularjs 如何从已更新的父组件列表中更新子组件

Angularjs 如何从已更新的父组件列表中更新子组件,angularjs,angular-components,Angularjs,Angular Components,我是Angular的新手,目前正在使用1.6版 我正在实现Angular的组件样式。我只是想问一下,从父组件到子组件的最佳通信方式是什么?我知道存在一个问题,但我有一个特定的场景(我不确定它是否独特) 以下是场景: 模式->创建新todo->父对象(更新对象)->个人todo(更新列表) 我有一个创建待办事项的模式 然后在创建新todo后,在父对象上传递值以更新todo的对象 当我更新todo pass的父列表时,将其传递给个人todo组件以更新视图上的列表 angular.module(“…”

我是Angular的新手,目前正在使用1.6版

我正在实现Angular的组件样式。我只是想问一下,从父组件到子组件的最佳通信方式是什么?我知道存在一个问题,但我有一个特定的场景(我不确定它是否独特)

以下是场景:

模式->创建新todo->父对象(更新对象)->个人todo(更新列表)

  • 我有一个创建待办事项的模式
  • 然后在创建新todo后,在父对象上传递值以更新todo的对象
  • 当我更新todo pass的父列表时,将其传递给个人todo组件以更新视图上的列表
  • angular.module(“…”)
    .组件(“…”{
    绑定:{
    todos:“如何使用父组件的更改更新子组件
    使用


    • 老实说,我已经这样做了,但是当我更新父值$onChanges时,它没有触发将该值传播到其他子组件。有什么想法吗?如果使用对象或数组,你真的必须小心!请参见:@dom谢谢你提供的信息。我更新了答案,以显示如何使用
      $doCheck和。当询问由您的代码引起的问题时,如果您提供人们可以用来重现问题的代码,您将得到更好的答案。尽可能少使用仍然产生相同问题的代码。请参阅。如果
      TabController
      是用
      ng controller
      指令实例化的,则
      $onChanges
      钩子永远不会触发,因为
      ng controller
      指令不绑定任何内容。问题定义了两个名为
      “…”
      的组件。这两个组件分别是
      nvPersonalTodo
      ?和
      nvExternalTodo
        angular.module('tab')
          .controller('TabController', TabController);
      
        function TabController() {
          let vm = this;
          let updatedTodoObject = {};
      
          vm.$onInit = function () {
            vm.personalTodo = vm.todo.own_todo;
            vm.externalTodo = vm.todo.external_todo;
          }
      
          vm.$onChanges = function (changes) {
            console.log('I\'m triggered');
          }
      
          vm.updateTodoList  = updateTodoList;
      
         function updateTodoList( result ) {
          updatedTodoObject = angular.copy(vm.todo);
          updatedProjectObject.user_todos.push(result)
          if( vm.todo !== updatedTodoObject) {
           vm.todo = updatedTodoObject;
          } else {
           console.log("Still in reference");
          }
         }
      
          vm.getUpdatedTodotList = function( ) {
            return vm.todo;
          }
        }
      
      angular.module('...')
          .component('...', {
            bindings: {
              onResultTodoUpdated: '&'
            },
            controllerAs: 'todo',
            controller: ['TodoService', '$log', '$state', function(TodoService, $log, $state) {
              let vm = this;
              let todo = {};
      
              vm.newTodoModal = function() {
                TodoService.newTodoModal()
                  .then(function (TodoName) {
                    TodoService.createTodo(TodoName)
                      .then(function(response) {
                        if( response.status === 201 ) {
      
                          todo = {
                            ...
                            ...
                          }
      
                          vm.onResultTodoUpdated( { result: todo } );
                        }
                      })
                      .catch(function(error) {
                        console.log(error);
                      });
      
        angular.module('...')
          .component('...', {
            bindings: {
              todos: "<"
            },
            controllerAs: 'personal',
            controller: function(){
              let vm = this;
              vm.isShowTodoArchived = false;
      
              vm.$onInit = function () {
                getWatchedTodo();
              }
      
              function getWatchedTodo () {
               vm.todos = vm.todos;
               vm.todosSize = vm.todos.length;
              }
      
      <div class="tab-pane active" id="todosTab">
        <nv-new-todo on-result-todo-updated="todo.updateTodoList(result)"></nv-new-project>
      
        <div class="my-todos">
          <nv-personal-todo todos="todo.personalTodo" ></nv-personal-todo>
          <nv-external-todo todos="todo.externalTodo"></nv-external-todo>
        </div>
      </div>
      
      app.component('nvPersonalTodo', {
        bindings: {
          todos: "<"
        },
        controller: function(){
          var vm = this;
          this.$doCheck = function () {
            var oldTodos;
            if (!angular.equals(oldTodos, vm.todos)) {
              oldTodos = angular.copy(vm.todos);
              console.log("new content");          
              //more code here
            };
          }
      })