私はずっと以前からプロジェクト用のjQueryプラグインとして再利用可能なコンポーネントを作成してきました。私はロジックを抽象化することができ、状況(セレクタ、オプションなど)のすべてをケースバイケースで注入するのが好きです。KnockoutJSで再利用可能なコンポーネントを作成する
今、私はKnockoutJSを使い始めていて、内部論理にKnockoutを使った素敵な小さなjQueryプラグインを書いています。それはかなりうまくいくが、もっと良い方法があるのだろうか? Knockout自体に再利用可能なコンポーネントを作成するためのパターン/規則がありますか、またはこのパターンは大丈夫ですか?
ここでは例を挙げて説明しますが、私が何をしているのか分かります。
/*globals jQuery, knockout */
(function ($, ko) {
"use strict";
$.fn.itemManager = function (options) {
// set up the plugin options
var opts = $.extend({}, $.fn.itemManager.defaultOptions, options),
$wrap = $(this),
templateUrl = '/path/to/template/dir/' + opts.templateName + '.html';
// set up the KO viewmodel
function ItemManagerModel(items) {
var self = this;
self.items = ko.observableArray(items);
self.chosenItemId = ko.observable();
self.chosenItemData = ko.observable();
// generic method for navigating the Item hierarchy
self.find = function (array, id) {
/* ... */
};
/* bunch of other stuff... */
self.goToItem(items[0]);
}
// this is where the whole thing starts...
$(opts.openTriggerSelector).click(function (e) {
e.preventDefault();
// set the template html
$.get(templateUrl, function (data) {
$wrap.html(data);
});
// initial load and binding of the data, in reality I have some more conditional stuff around this...
// there's probably a better way to do this, but I'll ask in a separate question :)
$.get(opts.getItemsServiceUrl, function (result) {
ko.applyBindings(new ItemManagerModel(result), document.getElementById($wrap.attr('id')));
$wrap.data('bound', true);
});
// opens the template, which now is bound to the data in a dialog
$wrap.dialog({ /* ... */ });
// provide default plugin options
$.fn.itemManager.defaultOptions = {
getItemsServiceUrl: '/path/to/service',
openTriggerSelector: 'a',
templateName: 'Default'
};
} (jQuery, ko));
非常にクールです。だから私は "KOはパターンを持っている/コンポーネントを作成するための慣習は"答えは、基本的にはないと思いますか? –
私が知っていることはありません。機能のカスタムバインディングへの移行はパターンだと思います。これに関してはかなり制限されていますが、誰かがこれにバリエーションを出す可能性があります。ノックアウト検証は、多くの作業を行うエクステンダーを提供する再利用可能なコンポーネントです。 – madcapnmckay