// 
//     Licensed to the Apache Software Foundation (ASF) under one
//     or more contributor license agreements.  See the NOTICE file
//     distributed with this work for additional information
//     regarding copyright ownership.  The ASF licenses this file
//     to you under the Apache License, Version 2.0 (the
//     "License"); you may not use this file except in compliance
//     with the License.  You may obtain a copy of the License at
// 
//       http://www.apache.org/licenses/LICENSE-2.0
// 
//     Unless required by applicable law or agreed to in writing,
//     software distributed under the License is distributed on an
//     "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
//     KIND, either express or implied.  See the License for the
//     specific language governing permissions and limitations
//     under the License.
//

= Видео 'Использование KnockoutJS в приложении HTML5'
:jbake-type: tutorial
:jbake-tags: tutorials 
:jbake-status: published
:icons: font
:syntax: true
:source-highlighter: pygments
:toc: left
:toc-title:
:description: Видео 'Использование KnockoutJS в приложении HTML5' - Apache NetBeans
:keywords: Apache NetBeans, Tutorials, Видео 'Использование KnockoutJS в приложении HTML5'

В этой серии видеоруководств демонстрируется создание клиентского приложения HTML5 с использованием jQuery и KnockoutJS. В рамках этого руководства будет рассмотрена привязка элементов DOM к модели данных, определение обработчиков событий и получение данных от служб JSON и REST.

Автор: Джон Джулион-Цесарелли (John Jullion-Ceccarelli)

|===
|
=== Загрузить / смотреть видео полностью:

* link:http://bits.netbeans.org/media/knockout1-basic-bindings.mp4[+Knockout - Часть 1. Основные привязки+] (15 МБ)
* link:http://bits.netbeans.org/media/knockout2-json.mp4[+Knockout - Часть 2. JSON+] (12 МБ)
* link:http://bits.netbeans.org/media/knockout3-click-handler.mp4[+Knockout - Часть 3. Обработчик событий click+] (19 МБ)
 |


== Knockout - Часть 1. Основные привязки


== Knockout - Часть 2. JSON


== Knockout - Часть 3. Обработчик событий click

 

|
link:/about/contact_form.html?to=3&subject=Feedback:%20Video%20of%20Using%20KnockoutJS%20in%20an%20HTML5%20Application[+Отправить отзыв по этому учебному курсу+]
 
|===


== Связанные ссылки

* link:html5-gettingstarted.html[+Начало работы с приложениями HTML5+]
* link:https://blogs.oracle.com/netbeanswebclient/[+Блог NetBeans Web Client+]
* link:../../trails/php.html[+Учебная карта по PHP и HTML5+]
