Что такое хороший шаблон разработки в C# для классов, которые должны сослаться на другие классы?

Вы просто дважды вызываете переключатель начальной загрузки; один в вашем файле main.js как;

$("input[type=\"checkbox\"], input[type=\"radio\"]").not("[data-switch-no-init]").bootstrapSwitch();

Второй в вашем index.js, который вы сделали для стекаблиц для каждой радиокнопки. Поэтому, когда вы пытаетесь переключить радио, событие изменения срабатывает дважды.

Для решения:

Я просто закомментировал строку начальной загрузки в файле main.js , чтобы не потерять контроль над радиостанциями и для простейшего использования обновите файлы index.html и index.js , как показано ниже;

Index.html

<table class="overall-table" align="center">
   <thead></thead>
   <tbody>
     <tr>
        <td><th>Choice: None / Add / Dis:&nbsp;</th></td>
        <td></td>
        <td>
           <input id="cbox1" name="GroupedSwitches" class="bootstrap-switch" type="radio" data-off-text="OFF" data-on-text="ON" checked="true" value="none">
           <input id="cbox2" name="GroupedSwitches" class="bootstrap-switch" type="radio" data-off-text="OFF" data-on-text="ON" checked="false" value="add">
           <input id="cbox3" name="GroupedSwitches" class="bootstrap-switch" type="radio" data-off-text="OFF" data-on-text="ON" checked="false" value="dis">
        </td>
      </tr>
   </tbody>
</table>

[ 1115] Index.js

$( document ).ready(function()
{
    $(".bootstrap-switch").bootstrapSwitch({
        'size': 'midi',
        'onSwitchChange': function(event, state){
            console.log("event", event);
            console.log("state", state);
            console.log("this", this); //this mean the checked radio in here
            console.log("checked radio value", $(this).val());
            // Do your logic in here according to the value 
            // if..else..
        }
    });
});

Кстати, вам не нужен элемент формы для определения проверенного события, переключатель сделал это для вас:)

Надеюсь, это поможет .

7
задан Kevin P. 3 November 2008 в 08:58
поделиться

6 ответов

Если Вы имеете книгу Рефакторинга Martin Fowler, просто следуете за "Изменением Однонаправленная Ассоциация к Двунаправленному" рефакторингу.

В случае, если у Вас нет его, вот то, как Ваши классы будут похожи после рефакторинга:

class C
{
  // Don't to expose this publicly so that 
  // no one can get behind your back and change 
  // anything
  private List<W> contentsW; 

  public void Add(W theW)
  {
    theW.Container = this;
  }

  public void Remove(W theW)
  {
    theW.Container = null;
  }

  #region Only to be used by W
  internal void RemoveW(W theW)
  {
    // do nothing if C does not contain W
    if (!contentsW.Contains(theW))
       return; // or throw an exception if you consider this illegal
    contentsW.Remove(theW);
  }

  internal void AddW(W theW)
  {
    if (!contentW.Contains(theW))
      contentsW.Add(theW);
  }
  #endregion
}

class W
{
  private C containerC;

  public Container Container
  {
    get { return containerC; }
    set 
    { 
      if (containerC != null)
        containerC.RemoveW(this);
      containerC = value; 
      if (containerC != null)
        containerC.AddW(this);
    }
  }
}

Обратите внимание, которое я сделал List<W> частный. Выставьте список Ws через перечислитель вместо того, чтобы выставить список непосредственно.

например, общедоступный Список GetWs () {возвращает это. ContentW.ToList ();}

Код выше передачи права собственности дескрипторов правильно. Скажите, что у Вас есть два экземпляра C - C1 и C2 - и экземпляры W - W1 и W2.

W1.Container = C1;
W2.Container = C2;

В коде выше, C1 содержит W1, и C2 содержит W2. Если Вы повторно присваиваете W2 C1

W2.Container = C1;

Затем C2 будет иметь нулевые объекты, и C1 будет иметь два объекта - W1 и W2. У Вас может быть плавание W

W2.Container = null;

В этом случае W2 будет удален из списка C1, и он не будет иметь никакого контейнера. Можно также использовать Добавление и Удалить методы из C для управления контейнерами W - так C1. Добавьте (W2) автоматически удалит W2 из, он - исходный контейнер, и добавьте его к новому.

6
ответ дан 6 December 2019 в 21:21
поделиться

Я обычно делаю это что-то вроде этого:

class C
{
   private List<W> _contents = new List<W>();
   public IEnumerable<W> Contents
   {
      get { return _contents; }
   }

   public void Add(W item)
   {
      item.C = this;
      _contents.Add(item);
   }
}

Таким образом Ваше свойство Contents только для чтения, и Вы добавляете объекты через метод своего агрегата только.

3
ответ дан 6 December 2019 в 21:21
поделиться

Хм, похож, Вы почти получили его с одним незначительным незначительным сбоем - необходимо смочь управлять дополнением к списку в C.

например,

class C
{
    private List<W> _contentsW;

    public List<W> Contents 
    {
        get { return _contentsw; }
    }

    public void AddToContents(W content);
    {
        content.Container = this;
        _contentsW.Add(content);
    }
}

Для проверки просто необходимо выполнить итерации через список, я думаю:

foreach (var w in _contentsW)
{
    if (w.Container != this)
    {
        w.Container = this;
    }
}

Не уверенный, если это - то, в чем Вы нуждаетесь.

Действительно поймите, что может быть несколько экземпляров W, который имел бы те же значения, но может иметь различные контейнеры C.

2
ответ дан 6 December 2019 в 21:21
поделиться

Подробно останавливающийся на ответе Жонса....

Вам, возможно, понадобятся слабые ссылки, если W, как предполагается, не поддерживает C.

Также... добавление должно быть более сложным, если Вы хотите передать владение...

public void AddToContents(W content);
{  
   if(content.Container!=null) content.Container.RemoveFromContents(content);
    content.Container = this;
    _contentsW.Add(content);
}
1
ответ дан 6 December 2019 в 21:21
поделиться

Это - шаблон, который я использую.

public class Parent {
    public string Name { get; set; }
    public IList<Child> Children { get { return ChildrenBidi; } set { ChildrenBidi.Set(value); } }
    private BidiChildList<Child, Parent> ChildrenBidi { get {
        return BidiChildList.Create(this, p => p._Children, c => c._Parent, (c, p) => c._Parent = p);
    } }
    internal IList<Child> _Children = new List<Child>();
}

public class Child {
    public string Name { get; set; }
    public Parent Parent { get { return ParentBidi.Get(); } set { ParentBidi.Set(value); } }
    private BidiParent<Child, Parent> ParentBidi { get {
        return BidiParent.Create(this, p => p._Children, () => _Parent, p => _Parent = p);
    } }
    internal Parent _Parent = null;
}

Очевидно, у меня есть классы BidiParent<C, P> и BidiChildList<C, P>, последний которого реализует IList<C>, и т.д. Закулисные обновления сделаны через внутренние поля, в то время как обновления из кода, который использует эту модель предметной области, сделаны через общественные собственности.

0
ответ дан 6 December 2019 в 21:21
поделиться

Одна опция для этого состояла бы в том, чтобы реализовать IContainer и интерфейсы IComponent, найденные под Системой. ComponentModel. C был бы контейнером и W компонент. Класс ComponentCollection затем служил бы устройством хранения данных для Ваших экземпляров W и IComponent. Сайт предоставил бы обратный канал C.

0
ответ дан 6 December 2019 в 21:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: