2013-07-10 2 views
9

У меня возникла проблема с применением пользовательских обработчиков привязки при использовании нокаута с requireJS. В основном, в прошлом я включил глобальный файл js-обработчика привязки, который содержит все мои пользовательские привязки. Теперь, когда я использую requireJS для обеспечения зависимостей, я не уверен, как получить доступ к этим настраиваемым связям.Пользовательские обработчики привязки с нокаутом и RequireJS

Раньше я создавать глобальные функции с

function KOCustomBindings() { 
// Custom Bindings 
ko.bindingHandlers.returnKey = { 
//handler code 
} 
} 

Теперь, когда я использую требует, я чувствую, как будто я должен иметь определения ничего о

define(['jquery', 'knockout'], 
    function($, ko)){ 
// Custom Bindings 
return KOCustomBindings; 
} 
}); 

Однако, я не» t верят, что привязки будут выполняться, если специально не называть, возможно, в прокладке? У кого-нибудь есть идеи по этому поводу?

Спасибо за вашу помощь,

ответ

9

Поскольку пользовательские привязки изменить ko объект, их нужно только один раз загружать, а их модулям ничего не нужно возвращать. Если в качестве первого шага в вашем приложении есть раздел main/entry/app, просто требуется, чтобы ваши пользовательские привязки и расширители - это все, что вам нужно сделать.

define(['jquery', 'knockout'], function($, ko)){ 
    // Custom Bindings 
    ko.bindingHandlers.returnKey = { ... } 

    //NO return needed 
}); 

Затем в вашем автозапуск, просто

require('lib/custom-ko-bindings'); 
3

Самый простой способ сделать это, чтобы определить пользовательский привязки в качестве модуля AMD и требуют его из родительского ViewModel. Пример -

Bindings.js

define(, function() { 
    ko.bindingHandlers.Date = { 
     update: function (element, valueAccessor) { 
      var value = valueAccessor(); 
      var date = moment(value()); 
      var strDate = date.format('MM-DD-YYYY'); 
      $(element).text(strDate); 
     } 
    }; 
}); 

Ваш ViewModel -

define(['jquery', 'knockout', 'bindings'], 
    function($, ko, bindings)){ 
}); 

Это даст какой-либо элемент в вашем доступе DOM к связывания обработчика нокауте 'Дата', например. (Мой пример, который я использовал с moment.js)

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

<span data-bind="Date: myDate" /> 
3

мне удалось достичь этого путем оборачивания нокаута в моем модуле привязок и возвращая модифицированный экземпляр нокаута. Вот конфиг я закончил с:

require.config({ 
    paths: { 
    'knockout': 'lib/knockout', // name that's only used once in customBindings.js 
    'ko': 'app/customBindings' 
    } 
    // more config ommitted 
}); 

Мои пользовательские привязки:

define(['knockout'], function (ko) { 
    ko.bindingHandlers.returnKey = { 
     //handler code 
    } 
    return ko; 
}); 

И мои модули, которые требуют нокаута нужно только ссылаться «Ко».

require(['jquery', 'ko', 'underscore'], function ($, ko, _) { 
    // do knockout-y things! now with bindings! 
}); 
Смежные вопросы