Если вы знаете, сколько уровней может быть вложено, вы можете использовать Eager Loading. Скажем, если максимальная глубина составляет 3 уровня, вы можете сделать:
$model->with('parent.parent.parent');
Вы также можете использовать рекурсию вместо цикла.
public function getParentsAttribute()
{
if (!$this->parent) {
return collect([]);
}
return collect($this->parent->parents)->push($this->parent);
}
Если вы тоже хотите добавить первый объект (само), полный вызов будет:
$model->parents->push($model)->reverse->implode('attr_name', '/');
, который вы также можете включить в атрибут
public function getPathAttribute() {
return $model->parents->push($model)->reverse->implode('attr_name', '/');
}
[119 ] И звоните как $model->path;
Хотя вы можете выполнять Postbacks с помощью JQuery, может быть лучше вызвать веб-метод (веб-сервис, который находится на вашей странице). Вызов также может быть быстрее, потому что вы не публикуете всю страницу ViewState.
Посмотрите, поможет ли это: http://www.codeproject.com/KB/aspnet/sample.aspx .
По сути, вы объявляете фиктивный тег привязки:
<a id="anchorId" runat="server" onclick="return true" onserverclick="foo"></a>
В коде позади вам нужно объявить метод foo:
protected void foo(object sender, EventArgs e)
{
// Do something here
}
Затем вы можете вызвать функцию onclick этой привязки с помощью этого javascript:
document.getElementById('anchorId').click()
You should be able to stop the postback with whatever JS is attached to the button onclick event, regardless of whether it is a WebControl or a standar HTML button, by returning false.
E.g.
Вам необходимо установить для скрытого поля __EVENTTARGET соответствующее значение, если вы хотите вызвать обработчик события при обратной передаче. Однако я бы сделал это иначе. Поместите в модальное диалоговое окно кнопки ASP, с которыми связан обработчик событий. Сделайте так, чтобы обработчик щелчков, который всплывал в диалоговом окне, возвращал значение false (чтобы после этого нажатия кнопки обратной передачи не происходило). Таким образом, ваша форма отправляется обратно с кнопки ASP, и автоматически вызывается обработчик, включая настройку скрытого поля на стороне клиента.
Посмотрите эту статью
http://www.deviantpoint.com/post/2009/03/12/Using-jQuery-UI-Dialogs-for-confirmation-windows.aspx
Основная идея состоит в том, что вы помещаете функцию обратного вызова в скрытое поле и запускаете eval в $ (this) .dialog ('close');
Я использовал это, чтобы заставить ее работать в Gridview, так что, если вы хотите знать, как это сделать, оставьте комментарий.