Изящный способ предотвратить круговые события в MVC?

Сначала нужно преобразовать строку json в объект json / map, используя gson, Jackson или другой метод.

Затем, когда у вас есть карта, попадания находятся под ключом: hit.hits, поскольку в качестве массива карт каждая карта в массиве представляет собой попадание со своими метаданными. Оригинальный документ находится под ключом _source в каждом хите.

Я также настоятельно рекомендую ознакомиться с документами эластичного поиска, которые являются хорошим источником.

7
задан Michael Gundlach 18 December 2008 в 16:34
поделиться

2 ответа

Только резюмировать модель MVC. Представления должны обычно обновлять себя. Вот то, как это работает: контроллер изменяет состояние модели, модель отправляет обновления своих представлений, получения по запросу представлений в новом состоянии из модели, и обновите себя. В то время как контроллеры и представления обычно связываются (т.е. выполняющий развертку на данных в графическом представлении), они никогда не должны взаимодействовать непосредственно, только через модель. Это в целом, конечно.

Таким образом, функции JS, которые обновляют Ваши представления, не являются на самом деле контроллерами, который является важным различием. Их нужно считать частью Вашего представления. Это не могло бы быть полезно проблеме под рукой, но я думал, что она заслужила указание.

Вы не можете также удалить свою модель, я предполагаю, что Вы подразумеваете удаление чего-то из модели так как никакие представления или контроллеры не могут на самом деле существовать (или быть в функциональном состоянии), если они не поддерживаются моделью.

Быть JS кодирует жокея, и не использовавший gmaps я действительно не вижу, где проблема. Изменение состояния флажка (проверенное свойство) запускают onClick () событие? Это действительно не было должно, по моему скромному мнению, но возможно они реализовали его тот путь, иначе Вы могли просто присоединить свой контроллер к onClick () и добавить некоторую логику к флажку (или, при этом этот был JS, в функции где-нибудь) изменить состояние флажка. Если это не возможно, опция 1 и 2 определенно Ваш лучший выбор.

дополнение: пользователь, взаимодействующий с целью

Таким образом, что происходит, когда пользователь хочет взаимодействовать с целью? Часто виджет будет включать и представление и контроллер. Флажок имеет представление (Вы видите, проверяется ли он или не), и также контроллер (можно нажать его). При нажатии на флажок в принципе следующее должно произойти:

  • контроллер флажка получает событие
  • контроллер флажка изменяет состояние для значения, которое этот флажок представляет в модели
  • модель обновляет слушателей (включая флажок)
  • флажок обновляет свой взгляд, чтобы отразить, что то значение изменилось

Первый шаг, как контроллер получает событие, является несколько языковозависимым, но на языках ООП это вероятно объект прослушивателя, присоединенный к событиям пользовательского интерфейса на этом конкретном виджете, который или является контроллером или уведомляет контроллер относительно взаимодействия с пользователем.

3
ответ дан 7 December 2019 в 16:46
поделиться

Это - жесткое. Если я понимаю правильно, проблемные результаты, потому что Вы выставили обработчик щелчков на своей модели, и событие щелчка модели поймано контроллером. Контроллер обновляет представление, которое в свою очередь переключает то же событие.

С моей точки зрения я считал бы это несоответствующим, чтобы Контроллер присоединился к событию Edge's Click, потому что это выставляет слишком много детали о том, как Край реализуется и используется. Контроллер не заботится о том, как Край используется или любые другие детали реализации.

На самом деле канонический стиль MVC не требует, чтобы Контроллер сцепился на любые события Model вообще, обычно потому что состояние Модели не видоизменено Представлением или любыми другими Контроллерами. Не необходимый, чтобы Модель уведомила Контроллер, что это было изменено.

Для решения проблемы необходимо определить интерфейс Представления, чтобы иметь отдельный метод, такой как ToggleEdge:


public interface GraphView
{
    event Action ToggleEdge;
}

Его привлечение хотеть создать два метода, EdgeClicked и CheckboxClicked, но настаивание на двух независимых методах как этот нарушает принцип инкапсуляции. Это выставляет слишком много деталей реализации Вашему Контроллеру или кому-либо еще, кто хочет сцепиться на те события. Помните, Контроллер только заботится, что состояние Представления изменилось, это не заботится, как это изменилось.

При реализации интерфейса View на пользовательский интерфейс необходимо заботиться, чтобы гарантировать, что событие ToggleEdge вызывается от одного местоположения. Можно сделать это путем сцепления на Край. Нажатое событие в Вашем Представлении и использовании его для переключения флажка; это делает Ваш флажок ответственным за повышение вентилятора Переключателя до контроллера:


public class UI : UserControl, GraphView
{
    public event Action ToggleEdge;

    void OnToggleEdge(Edge edge)
    {
        if (ToggleEdge != null)
            ToggleEdge(edge);
    }

    protected void Edge_Clicked(object sender, EventArgs e)
    {
        CheckBox chkbox = FindCheckBoxThatCorrespondsToEdge((Edge)sender);
        chkbox.Checked = !chkbox.Checked;    
    }

    protected void chkEdge_CheckChanged(object sender, EventArgs e)
    {
        Edge edge = FindEdgeThatCorrespondsToCheckbox((CheckBox)sender);
        OnToggleEdge(edge);
    }
}

Можно привести аргумент, что Представление знает слишком много о своей реализации теперь: его осведомленное, что края и флажки существенно соединены. Возможно, это - другой взлом, но он может, вероятно, быть отклонен как "логика UI", должен сохранить дисплей Представления синхронизируемым.

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

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