は、私は次のシナリオのための良い方法を定義するために苦労しています:ネスティングコントローラとディレクティブ
私はLaravel建てAPIを消費AngularJsアプリを持っています。
マイタスクのインデックスページには、タスクが一覧表示されます。リストの一番下には、タスクの2つの基本要件を入力できる新しいエントリ行があり、新しいタスクが(私のAPIを呼び出すサービスを介して)作成され、項目が範囲内にプッシュされます。
ここで問題が発生します。ユーザーが既存のタスクをクリックすると、タスクのすべての詳細が表示されるサイドバーが開きます。すべての詳細は編集可能で、サブタスク、添付ファイルなどの追加も含まれます。APIアップデートメソッドを呼び出すにはsaveをクリックする必要がありますが、タスクがリスト内で更新されているためサイドバーで変更が行われているため、どういうわけか、タスクリストのスコープをタスクサイドバーから切り離したいのですが、タスクが保存されるときにリストを明示的に更新してください。
My TasksControllerは非常に奇抜であります。現時点では、「selectedTask」変数を(選択したタスクを使用して)作成し、サイドバー・ビューで使用するng-click機能があります。
私は良い方法があることを知っています。ディレクティブを使ってタスクサイドバー用の新しいコントローラを作成しようとしましたが、データのやりとりをどのように行うことができないか分かりません。
私はから来ていますかを理解するのに役立ついくつかのコード:
app.jsルート
.state('root.tasks', {
url: '/tasks',
views: {
'[email protected]': {
templateUrl: '../partials/tasks-index.html',
controller: 'TasksController as TasksCtrl'
},
'[email protected]': {
templateUrl: '../partials/task-detail-sidebar.html'
}
}
})
TasksControllerショータスク機能
vm.showTask = function(task, added) {
// if same task is clicked in list again, or close button clicked, close task
if (vm.selectedTask.id == task.id && vm.clickedShut == false && !added) {
vm.clickedShut = true;
} else {
// else open task sidebar and create selectedTask
vm.clickedShut = false;
task.newSubtask = {'title':'', 'assignees':[task.task_owner]};
vm.selectedTask = task;
// need to grab current owner/assignees so we know if they change when saving - if so, notifications are sent
vm.currentOwner = task.task_owner.id;
vm.currentAssignees = [];
if (task.assignees) {
for (var i = 0; i < task.assignees.length; i++) {
vm.currentAssignees.push(task.assignees[i].id);
}
}
}
};
TasksController updateTask
vm.updateTaskFromSidebar = function() {
TasksService.update(vm.selectedTask).then(function(data) {
if (data.data.task_owner.id !== vm.currentOwner && data.data.task_owner.id !== $rootScope.currentUser.id) {
NotificationsService.updateOwner(data.data, $rootScope.currentUser)
}
var newAssignees = data.data.assignees;
var alertAssignees = [];
if (newAssignees) {
for (var i = 0; i < newAssignees.length; i++) {
if (vm.currentAssignees.indexOf(newAssignees[i].id) === -1 && newAssignees[i].id !== data.data.task_owner.id && newAssignees[i].id !== $rootScope.currentUser.id) {
alertAssignees.push(newAssignees[i]);
}
}
if (alertAssignees.length) {
NotificationsService.updateAssignees(data.data, alertAssignees, $rootScope.currentUser);
}
}
vm.showSimpleToast('Task Saved');
}).catch(function() {
vm.showAlertDialog('Error Updating Task', "We've spotted this and will work to resolve the problem as soon as possible.");
});
};
Iイベントリスナーについて考えましたが、膨大な数のタスクが発生しています。これは、パフォーマンスに関する問題がイベントを絶えず監視する原因にはなりませんか?私はタスクをクローンすることができますが、どうすれば元に戻すことができますか? – DJC
タスク・アップデート・イベントは、タスク・コントローラで1回、またはタスク・サービスで一度監視されます。それはあなたが持っている仕事の数とは何の関係もありません。更新されたタスクIDと詳細をイベントの引数として送信できます。バインディングが引き続き機能するように、元のタスクに属性をコピーし直す(タスクを置き換えない)ことを覚えておいてください。この種のコピーは、拡張で行うことができます。 – Nitzo
ありがとう私はこれも行くよ – DJC