我正在尝试在角度js中创建“待办事项列表”。完成任务后,我希望能够单击复选框以标记完成。虽然它正在处理index.html,但我无法通过测试。
这是我的测试:
describe('ToDoListController', function() {
beforeEach(module('ToDoList'));
var ctrl;
beforeEach(inject(function($controller) {
ctrl = $controller('ToDoListController');
}));
it('initialises with an empty list and term', function() {
expect(ctrl.listDisplay).toEqual([]);
expect(ctrl.taskTerm).toBeUndefined();
});
describe('when viewing the to do list', function(){
it('displays list items', function() {
ctrl.taskTerm = "hello";
ctrl.addTask();
expect(ctrl.listDisplay[0].task).toBe("hello");
});
it('is completed when clicked', function() {
ctrl.taskTerm = "hello";
ctrl.addTask();
ctrl.isCompleted("hello");
expect(ctrl.listDisplay[0].completed).toBe(true)
});
});
});
这是我的控制者:
toDoList.controller('ToDoListController', [function() {
var self = this;
self.listDisplay = []
self.addTask = function() {
self.listDisplay.push({task: self.taskTerm, completed: false})
};
self.isCompleted = function(item) {
var i = self.listDisplay.indexOf(item)
self.listDisplay[i].completed = true
}
}]);
我要回的错误是:
TypeError: Cannot set property 'completed' of undefined
at self.isCompleted (/Users/edobrien/Documents/Projects/todo_challenge/js/toDoListController.js:13:35)
at Object.<anonymous> (/Users/edobrien/Documents/Projects/todo_challenge/test/toDoListController.spec.js:26:12)
作为参考,错误发生在“ctrl.isCompleted(”hello“);”线
非常感谢你们给予的任何帮助!
答案 0 :(得分:1)
您的控制器的isCompleted
方法错误:您的列表是一个对象数组,没有字符串:
self.addTask = function() {
self.listDisplay.push({task: self.taskTerm, completed: false})
};
如果将taskTerm设置为&#34; hello&#34;,则推入数组的对象不是字符串&#34; hello&#34;,而是像
这样的对象{task: "hello", completed: false}
因此,当您尝试使用indexOf(&#34; hello&#34;)找到它时,它将始终返回-1,因为
"hello" != {task: "hello", completed: false}
更改查找数组中对象的方式:
self.isCompleted = function(item) {
var completed=false;
self.listDisplay.forEach(function (value,index) {
if (value.task ==item) {
completed=value.completed;
}
});
return completed;
};
更新:我在阅读您的代码时犯了一个错误:isCompleted
是检查的方法的通常名称......好吧,如果事情已经完成。但实际上您的方法将设置为已完成。这种方法通常命名为setCompleted
。
所以方法应该是这样的:
self.setCompleted = function(item) {
self.listDisplay.forEach(function (obj,index) {
if (obj.task ==item) {
obj.completed=true; //setting it as completed
}
});
};