AMDを使用してhtmlテンプレートとビューモデルコードを取得するためのコンポーネントセットアップがあります。すべてうまく動作します。コンポーネントは渡されたパラメータで正常に動作し、正常に動作するとロードされます。問題は、テンプレートビューで値が表示されるviewModelでオブザーバブルを定義したことですが、オブザーバブルの値が変更されてもビューのテキストは変更されません。誰でもここで何が起こっているのか説明できますか?バインドしようとしているテキストはmodalTitleです。モーダルロード時にタイトルが 'TEMP'ですが、コンソールに移動して 'window.modalTitle()'と入力すると、 'CREATE REPORT SCHEDULE'が表示されます。それは、オブザーバブルの最初の値を取得してからそれを無視するというものです。とにかく私はそれが更新を探すために強制することができますか?ノックアウトコンポーネントビューは、ViewModelで観察可能な変更が行われても更新されません
のViewModel:(schedules.component.js)
define(['knockout'], function (ko) {
console.log('schedules hit');
loadCss('schedules');
function SchedulesViewModel(params) {
this.scheduledItems = params.scheduledItems;
this.itemName = params.itemName;
this.modalTitle = ko.observable("TEMP");
window.modalTitle = this.modalTitle;
}
SchedulesViewModel.prototype.initiateAddScheduledItem = function() {
this.modalTitle("CREATE " + this.itemName + " SCHEDULE");
$('#schedulesModal').modal('show');
};
SchedulesViewModel.prototype.removeSelectedScheduledItem = function() {
this.chosenValue('dislike');
};
window.ReportsApp.SchedulesViewModel = SchedulesViewModel;
return SchedulesViewModel;
});
ビューテンプレート
<div id="schedulesModal" class="modal fade lcmsModal" tabindex="-1" role="dialog">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<!--<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">×</span>
</button>-->
<img src="/Content/images/modalASLogo.png" style="float: right;" />
<h4 class="modal-title" data-bind="text: modalTitle()">Test Title</h4>
</div>
<div class="modal-body">
<p>One fine body ...</p>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">CANCEL</button>
<button type="button" class="btn btn-primary">SAVE</button>
</div>
</div><!-- /.modal-content -->
</div><!-- /.modal-dialog -->
</div><!-- /.modal -->
<!-- /Bootstrap Modal -->
うわー、非常に良い目 - 私は観察できないことに気づいていませんでした。私は非同期コンポーネントを使って作業をしていたと思います。通常、ビューモデル全体をIIFEとして宣言しています。これはカプセル化を改善しますが、非同期モジュールを使用すると、正常に動作するための関数を明示的に返す必要があります。 私が後で見なければならない唯一の質問は、ここに見られるようにko.applyBindindsへの2回目の呼び出しです。これは単なるコンポーネントなので、コンポーネントが継承する通常のviewModelがあります。複数のviewModelを持つことができるかどうかはわかりません。 – Disease
@Diseaseアップデートを見てください。 –
私はjsfiddleと入れ子になったviewModelsを理解していますので、私の質問は次のようになります:applyBindingsを何度も呼び出したいのですか?上のコードは非同期にロードされたコンポーネントのためのものであり、多くのコンポーネントがあります。私はすでにグローバル変数viewModelをウィンドウ変数に保存していますが、2番目のコンポーネントが読み込まれると、最初のコンポーネントからviewModelがどのように取得されるので、すべてのコンポーネントのビューモデルがバインドされますか?これらのコンポーネントのviewModelをグローバルコンテキストにバインドすることはできません。 window.schedulesViewModel = SchedulesViewModelが機能しません。また、渡されたコを保存しません。 – Disease