あなたはどのように組み合わせるか(合理的に)良い例hereを見つけることができます:
- コンポーネント
ページ毎の
- のViewModel
- 中央ServiceProviders(のためここで は私のコードです例、APIを呼び出す、または異なるコンポーネント間で状態情報を提供する)
コードはES2015(新しいJavascript)ですが、必要に応じてプレーンJavascriptで記述することもできます。 gulpスクリプトには、コンポーネント内のHTMLテンプレートの文字列化が含まれているため、結合されて1つのファイルとしてロードされますが、別々の要素として編集されます。
例コンポーネント:
const ko = require('knockout')
, CentralData = require('../../service-providers/central-data')
, CentralState = require('../../service-providers/central-state')
, template = require('./template.html');
const viewModel = function (data) {
//Make service providers accessible to data-bind and templates
this.CentralData = CentralData;
this.CentralState = CentralState;
this.componentName = 'Component One';
this.foo = ko.observable(`${this.componentName} Foo`);
this.bar = ko.observableArray(this.componentName.split(' '));
this.barValue = ko.observable("");
this.bar.push('bar');
this.addToBar = (stuffForBar) => {
if(this.barValue().length >= 1) {
this.bar.push(this.barValue());
CentralData.pushMoreData({firstName: this.componentName,secondName:this.barValue()});
}
};
this.CentralState.signIn(this.componentName);
if (CentralData.dataWeRetrieved().length < 10) {
var dataToPush = {firstName : this.componentName, secondName : 'Foo-Bar'};
CentralData.pushMoreData(dataToPush);
}
};
console.info('Component One Running');
module.exports = {
name: 'component-one',
viewModel: viewModel,
template: template
};
とコンポーネントテンプレート:あなたの目的のために
<div>
<h1 data-bind="text: componentName"></h1>
<p>Foo is currently: <span data-bind="text: foo"></span></p>
<p>Bar is an array. It's values currently are:</p>
<ul data-bind="foreach: bar">
<li data-bind="text: $data"></li>
</ul>
<form data-bind="submit: addToBar">
<input type="text"
name="bar"
placeholder="Be witty!"
data-bind="attr: {id : componentName}, value : barValue" />
<button type="submit">Add A Bar</button>
</form>
<h2>Central State</h2>
<p>The following components are currently signed in to Central State Service Provider</p>
<ul data-bind="foreach: CentralState.signedInComponents()">
<li data-bind="text: $data"></li>
</ul>
<h2>Central Data</h2>
<p>The following information is available from Central Data Service Provider</p>
<table class="table table-bordered table-responsive table-hover">
<tr>
<th>Component Name</th><th>Second Value</th>
</tr>
<!-- ko foreach: CentralData.dataWeRetrieved -->
<tr>
<td data-bind="text: firstName"></td><td data-bind="text: secondName"></td>
</tr>
<!-- /ko -->
</table>
<h3>End of Component One!</h3>
</div>
、あなたはCentral
状態プロバイダーと擬似APIを無視することはできますが、あなたのようにモデルが役に立つかもしれませんアプリはもっと複雑になります。
'ko.postbox'を使ってパブ/サブパターンを試すことができます:https://github.com/rniemeyer/knockout-postbox – cl3m
あなたの複数のビューモデルは、コンポーネントが良いアイデアだと思います。 http://knockoutjs.com/documentation/component-overview.html –