Как я могу диктовать порядок, в котором скрипты отображаются на странице при реализации IScriptControl.GetScriptReferences? - PullRequest
1 голос
/ 28 июня 2011

Как мне определить порядок отображения сценариев на странице при реализации пользовательских элементов управления с использованием интерфейса IScriptControl?

Вот пример того, что я делаю:

public class MyScriptControl : WebControl, IScriptControl
{
    private static ConcurrentBag<ScriptReference> ScriptReferences;

    static MyScriptControl()
    {
        ScriptReferences = new ConcurrentBag<ScriptReference>
        {
            new ScriptReference { Name = "jquery" },
            new ScriptReference { Name = "jquery-ui" },
            new ScriptReference { Name = "myscriptcontrol" }
        };
        ScriptManager.ScriptResourceMapping.AddDefinition("myscriptcontrol",
            new ScriptResourceDefinition
            {
                ResourceAssembly = Assembly.GetCallingAssembly(),
                ResourceName = "Path.To.Scripts.myscriptcontrol.js"
            }
        );
    }

    public MyScriptControl()
    { }

    protected override void OnPreRender(EventArgs e)
    {
        base.OnPreRender(e);
        ScriptManager.GetCurrent(Page)
            .RegisterScriptControl<MyScriptControl>(this);
    }

    protected override void Render(HtmlTextWriter writer)
    {
        // Render UI
    }

    public IEnumerable<ScriptReference> GetScriptReferences()
    {
        foreach (var reference in ScriptReferences)
        {
            yield return reference; 
        }
    }

    public IEnumerable<ScriptDescriptor> GetScriptDescriptors()
    {
        return new ScriptDescriptor[] { };
    }
}

Приведенный выше код создает проблему, поскольку он отображает ссылку на сценарий jQueryUI перед отображением ссылки на сценарий jQuery. Если я меняю порядок, скрипты отображаются в правильном порядке:

ScriptReferences = new ConcurrentBag<ScriptReference>
{
    new ScriptReference { Name = "myscriptcontrol" },
    new ScriptReference { Name = "jquery-ui" },
    new ScriptReference { Name = "jquery" }
};

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

Помимо выяснения, как определять порядок для зависимых сценариев, не стесняйтесь разбирать любые плохие практики или проблемный код, который вы видите здесь.

1 Ответ

0 голосов
/ 14 июля 2011

Не обязательно порядок, в котором объявляются сценарии, определяет порядок. Если у вас много сценариев и много функций DocumentReady, поскольку Jquery проходит по циклу и обрабатывает каждый функциональный блок DocumentReady, если документ еще не готов, он помещает функцию в стек ожидания. Если документ готов, он немедленно обрабатывает функцию. Поэтому вполне возможно, что вызовы DocReady для ваших первых включений всегда будут выполняться последними, а последние будут выполняться первыми, поскольку они обрабатываются в конце, когда документ наконец готов.

Этот пост очень хорошо объясняет это и предлагает обходной путь:

Изменить порядок выполнения DocumentReady

...