Насколько я понимаю вашу проблему, вы можете привязать событие к родительскому элементу, который существует в примере загрузки страницы document
$(document).on('click','.action-complete-task:not(.action-2)',function(){
//...1
})
$(document).on('click','.action-complete-task.action-2',function(){
//...2
})
, таким образом, он должен работать со вставленными вручную элементами (DOM-Manipulation ), а не запускать action1 (как это происходит сейчас, потому что ваш .action-2 также принадлежит .action-complete-task)
throw new ArgumentException("Reason", "param name");
Наиболее принятое решение состоит в том, чтобы выдать исключение. Чтобы доказать это, откройте отражатель и взглянуть на большинство классов от BCL и исключений, которые они могут выдать на конструкции.
Как пример. Список (набор IEnumerable) выдаст исключение, если набор будет пустым. Совершенно допустимый способ передать ошибки вызывающей стороне.
Много (все?) ответов говорят для выдачи исключения, но я уверен, что видел официальные заявления от команды разработчиков платформы, отговаривающей от выдавания исключения от конструкторов.
Обратите внимание, что классы в платформе.NET, которые ведут себя так же к Вашему "Банановому" примеру (где только определенные значения являются соответствующими для инстанцирования объекта с) не используют конструкторов, но вместо этого используют статические методы фабрики. Например, Система. Сеть. WebRequest не имеет никакого общедоступного конструктора и вместо этого использует помехи, Создают метод, который может повысить исключение, если предоставленной строкой не является допустимый URI. За некоторыми исключениями - посмотрите мое обновление ниже.
Таким образом для Вашего кода я изменил бы конструктора Banana на защищенный, и представил бы метод как это:
public static Banana Create(string color)
{
if (color != "green" && color != "yellow")
{
throw new ArgumentException("Color must be 'green' or 'yellow'",
"color");
}
return new Banana(color);
}
Обновление
Хорошо, кажется, что это не плохая идея выдать исключения от конструктора. На самом деле, Система. IO.FileStream делает просто это, если Вы передаете недопустимое имя файла его конструктору. Я предполагаю, что идея использовать статический метод фабрики является всего одним способом быть более явной о том, как Вы создаете экземпляр (например, если метод выше назвали "FromColor").
Если Ваш конструктор перестал работать, необходимо выдать исключение. По определению Конструкторы не возвращают значения, таким образом, Вы наклоняете возврат, скажем, код ошибки.
public class Banana
{
public Banana(string color)
{
if ( color == "red" )
throw new SomeException("intialization failed, red is an invalid color");
}
}
//////////////////////////////////////////////////////////
try
{
Banana banana1 = new Banana("green");
banana1.whatever();
}
catch( SomeException error )
{
// do something
}
finally
{
// always do this stuff
}