【发布时间】:2017-09-04 00:13:34
【问题描述】:
我是 Angular 新手,目前使用的是 1.6 版。
我正在实现 Angular 的组件样式。我只想问从父组件到子组件的最佳通信方式是什么?我知道存在一个问题,但我有一个特定的场景(我不确定它是否独特)。
这是场景:
Modal -> 创建新的 todo -> Parent(更新对象)-> Personal todo(更新列表)
- 我有一个创建待办事项的模式。
- 然后在创建新的 todo 后,将值传递给父级以更新 todo 的对象。
- 当我更新了 todo 的父列表时,将传递给个人 todo 组件以更新视图上的列表。
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>
【问题讨论】:
-
当询问由您的代码引起的问题时,如果您提供人们可以用来重现问题的代码,您将获得更好的答案。 尽可能少地使用仍然会产生相同问题的代码。参见How to create a Minimal, Complete, and Verifiable example。
-
如果
TabController是用ng-controller指令实例化的,$onChanges钩子将永远不会触发,因为ng-controller指令不会绑定任何东西。 -
该问题定义了两个名为
'...'的组件。哪个是nvPersonalTodo?哪个是nvExternalTodo?
标签: angularjs angular-components