2014-02-13 2 views
3

У меня есть DropDownList kendoUI, который находится в шаблоне и привязывается к ViewModel, наряду с пролетом, который привязан к элементу данных, выбранного в DropDownList:Какой лучший способ привязать выпадающий список пользовательского интерфейса Kendo к ViewModel, который заполнен источником данных?

<p> 
    <label>Appointment Type: </label> 
    <select id="appointmentTypeDropDownList" 
      data-text-field="Name" 
      data-value-field="AppointmentTypeId" 
      data-role="dropdownlist" 
      data-bind="source:appointmentTypes, value:AppointmentTypeId" 
      data-autobind="true" 
      data-select="onSelected" /> 
</p> 
<p><label>Duration:</label> 
    <span data-bind="text:selectedAppointment.Duration"></span> minutes 
</p> 

Мой ViewModel:

var viewModel = new kendo.observable({ 
    appointmentTypes: appointmentTypesDataSource, 
    selectedAppointment : null, 
}); 

Первоначально я использовал жестко запрограммированный массив назначений типов и установил selectedAppointment для назначенияTypes [0] в приведенном выше представленииModel. Это не работает сейчас, потому что источник данных загружается асинхронно. ViewModel обновляется в onSelected функции:

var onSelected = function (e) { 
    var dataItem = this.dataItem(e.item.index()); 
    viewModel.set("selectedAppointment", dataItem); 
}; 

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

Мой вопрос в том, как я могу получить привязку данных к пролету для работы над первым запросом, чтобы он отображал значение Duration текущего выбранного типа назначения из списка, возвращаемого источником данных? Я пытаюсь привязать его к выбранному элементу данных в раскрывающемся списке? Есть ли обратный вызов где-то, что я должен использовать для этого? Шаблон находится внутри kendoScheduler, если это имеет значение:

var template = kendo.template($("#editor").html()); 

$("#scheduler").kendoScheduler({ 
    editable: { 
     template: template() 
    } 
}); 

Спасибо!

Update: Шаблон я работаю с является редактором для Кендо UI планировщика, который не был связан с его ViewModel, но использует часть ViewModel для своего источника данных. В этом случае попытка использования синтаксиса data-bind = "events: {...}" вызывала странные ошибки типа, которые я получал. Чтобы подключить событие привязки к базе данных, Atanas сообщит мне, чтобы использовать data-bound = "onDataBound" и глобальную функцию обработчика (или поочередно настроить декларативный планировщик и привязать его к viewmodel). Использование данных в сочетании с ответами ниже работало для меня.

+0

Что такое желаемое начальное значение selectedAppointment? Как вы определяете его из источника данных? Очевидно, вы не хотите, чтобы он был нулевым. –

+0

Он должен соответствовать первому элементу в раскрывающемся списке, так как если пользователь ничего не делает, кроме сохранения формы, первым элементом в раскрывающемся списке будет выбранное значение. – ssmith

ответ

4

Вы можете использовать событие на раскрывающемся списке и установите selectedAppointment оттуда:

data-bind="source:appointmentTypes, value:AppointmentTypeId, events: { dataBound: onDataBound }" 

и ваш вид модели:

var viewModel = new kendo.observable({ 
    appointmentTypes: appointmentTypesDataSource, 
    selectedAppointment : null, 
    onDataBound: function(e) { 
     e.sender.select(0); // will trigger your change handler 
    } 
}); 
+0

Попытка получить эту работу, но получить ошибку «Uncaught TypeError: undefined не является функцией», которая, по-видимому, встречается в декларативной инициализации. Я попробовал это с onDataBound на моем viewModel, как показано, и как глобальную переменную; такой же эффект. Есть идеи? Благодарю. – ssmith

+0

также почему я могу использовать выбор данных для события select, но не привязан к данным для события привязки данных? – ssmith

+0

В этом jsFiddle подразумевается, что привязка привязки привязки недоступна для виджета DropDownList: http://jsfiddle.net/7GE3b/1/ – ssmith

1

Вам необходимо установить начальное значение selectedAppointment. Это единственный способ, которым текст диапазона будет установлен до того, как источник данных будет заполнен. Вот работоспособной демо на основе продуктов Northwind в:

<span data-bind="text:selectedProduct.ProductName"></span> 
<select data-bind="source: products, value: selectedProduct" 
     data-text-field="ProductName" 
     data-value-field="ProductID" 
     data-role="dropdownlist"></select> 
<script> 
var o = kendo.observable({ 
    selectedProduct: { 
    ProductID: 2, 
    ProductName: "Chang" 
    }, 
    products: new kendo.data.DataSource({ 
    transport: { 
     read: { 
     url: "http://demos.telerik.com/kendo-ui/service/products", 
     dataType: "jsonp" 
     } 
    } 
    }) 
}); 

kendo.bind(document.body, o); 
</script> 

Вот демо: http://jsbin.com/pawiz/1/edit

+0

Как насчет этого примера Ларс показал: http://plnkr.co/edit/kpQzzY9xWLxpt5aOlRj3?p=preview? Мне не удалось заставить его работать в моем действительном коде, потому что я всегда получаю ошибку «Uncaught TypeError: undefined is not function» в моих событиях: {} привязка, но она явно работает в его демонстрации. Я могу заставить его работать с вашим кодом, но это явно взломать, так как теперь мне нужно встроить магические значения в свой клиентский скрипт вместо того, чтобы полагаться на фактические данные из источника данных. Благодаря! – ssmith

+0

Почему это явно хак? Где «ценность» исходит из вашего реального сценария? Разве это не собственность другого? Источник данных не поддерживает «выбранное значение» сам по себе - он просто представляет массив элементов. Связанный пример всегда выбирает первый элемент данных после получения данных. –

+0

Поскольку в раскрывающемся списке нет пустого первого элемента (например, «выбрать элемент»), независимо от первого элемента, это элемент по умолчанию. В этом же соглашении любой элемент, находящийся в источнике данных dropdownlist, должен быть выбранным по умолчанию элементом в модели view (с его свойством Duration в моем случае, указанном в связанном диапазоне). Это взлом, чтобы включать имена/идентификаторы из источника данных в код клиента, поскольку я мог бы изменить источники данных в будущем, или порядок этих данных может измениться, а мой код будет неправильным, если я не обновляю жестко заданные значения. – ssmith

Смежные вопросы