2015-09-03 3 views
0

Итак, я использую эту библиотеку выбора даты. http://eonasdan.github.io/bootstrap-datetimepicker/Installing/#knockoutКак получить доступ к переменным внутри пользовательского привязки нокаута

Есть ли способ для моего захвата значения из обработчика и сохранения его в моей модели просмотра? Я хочу показать значение var picker = $(element).data('DateTimePicker'); за пределами обработчика внутри моей модели представления. Это возможно?

/*globals Hilary*/ 
 
Hilary.scope('learn').register({ 
 
    name: 'DatetimeVM', 
 
    dependencies: ['ko', 'jQuery', 'moment', 'OptionSelectVM'], 
 
    factory: function (ko, $, moment, OptionSelectVM) { 
 
     'use strict'; 
 

 
     return function (date) { 
 
      var self = { 
 
       date: { 
 
        type: ko.observable(), 
 
        start: ko.observable(), 
 
        end: ko.observable() 
 
       } 
 
      }; 
 

 
      if(!ko.bindingHandlers.dateTimePicker) { 
 
       ko.bindingHandlers.dateTimePicker = { 
 
        init: function (element, valueAccessor, allBindingsAccessor) { 
 
         //initialize datepicker with some optional options 
 
         var viewOptions = allBindingsAccessor().dateTimePickerOptions || {}, 
 
          options; 
 

 
         options = $.extend({ 
 
          inline: true, 
 
          debug: true 
 
         }, viewOptions); 
 

 
         $(element).datetimepicker(options); 
 

 
         //when a user changes the date, update the view model 
 
         ko.utils.registerEventHandler(element, 'dp.change', function (event) { 
 
          var value = valueAccessor(); 
 
          if (ko.isObservable(value)) { 
 
           if (event.date !== null && !(event.date instanceof Date)) { 
 
            value(event.date.toDate()); 
 
           } else { 
 
            value(event.date); 
 
           } 
 
          } 
 
         }); 
 

 
         ko.utils.domNodeDisposal.addDisposeCallback(element, function() { 
 
          var picker = $(element).data('DateTimePicker'); 
 

 
          if (picker) { 
 
           picker.destroy(); 
 
          } 
 
         }); 
 
        }, 
 
        update: function (element, valueAccessor) { 
 
         var picker = $(element).data('DateTimePicker'); 
 

 
         //when the view model is updated, update the widget 
 
         if (picker) { 
 
          var koDate = ko.utils.unwrapObservable(valueAccessor()); 
 

 
          //in case return from server datetime i am get in this form for example /Date(93989393)/ then fomat this 
 
          // koDate = (typeof (koDate) !== 'object') ? new Date(parseFloat(koDate.replace(/[^0-9]/g, ''))) : koDate 
 

 
          picker.date(koDate); 
 
         } 
 
        } 
 
       }; 
 
      } 
 

 
      return self; 
 
     }; 
 
    } 
 
});

ответ

1

Да, вы можете! Проверьте the custom bindings documentation, есть больше аргументов, переданных вашей функции привязки привязки init и update, чем вы в настоящее время используете, в том числе четвертый с именем viewModel для pre Knockout 3.x и bindingContext для версий 3.x.

Из указанных документации:

  • viewModel - Этот параметр является устаревшим в Knockout 3.x. Используйте bindingContext.$data или bindingContext.$rawData, чтобы получить доступ к модели представления.
  • bindingContext - Объект, который содержит контекст привязки, доступный для привязок этого элемента. Этот объект включает в себя специальные свойства, включая $parent, $parents и $root, которые могут использоваться для доступа к данным, связанным с предками этого контекста.

Остерегайтесь, хотя, это создает зависимость от обработчика для конкретных моделей вида, который обычно представляет собой красный флаг ИМХО. Явно передавая наблюдаемый или обратный вызов вашей текущей модели представления, который должен знать обработчик привязки, может быть лучше, поэтому вы можете написать, например.

<div data-bind="datepicker: { date: myDate, additionalData: someObservable }"></div>