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