プロジェクトでDust.jsとKnockout.jsを一緒に使用しており、 Duster-KOというモジュールを使用して 2 つを統合しています。この問題は、クライアント側でダスト テンプレートをレンダリングしようとしたときに発生します。オブザーバブル、またはオブザーバブルを含む任意のオブジェクトを Context パラメーターの Dust.render() に渡すと、ダストは実際には KO オブザーバブルを a に設定しています。 「チャンク」オブジェクト。これは、Knockout オブザーバブルが関数であり、Dust が渡す関数がオブザーバブルではなくコールバックであると考えているためであり、それが実行され、オブザーバブルがそのように設定されているためだと思います。
この問題を回避する方法、またはダストがオブザーバブルに触れないようにする方法はありますか?
以下は、私が遭遇した状況の例です。
var guest = exports.guest = function(opts) {
this.first = ko.observable(opts.first||"")
this.last = ko.observable(opts.last||"")
// ... more model code here
}
var table = exports.table = function(opts) {
// This is an observable array of guest objects
this.guests = ko.observableArray(opts.guests||[])
this.template = "tableTemplate"
this.target = opts.target // This is whatever DOM element we are injecting the template into
// ... more model code here
var self = this
this.draw = function() {
// Before we render the Dust template, the guest's first and last name are as they should be
// this.ctx is a Context object inherited from another parent object, which has the current object pushed onto it
var rendered = dust.render(self.template, this.ctx)
// At this point in the code, the guest's first and last name have been set to Chunk objects, rather than their actual first and last names
self.target.appendChild(rendered)
}
}
上記の例では、dust テンプレートをレンダリングする前に、各ゲストの姓名は変更されず、本来あるべき状態になっています。ただし、後で Chunk オブジェクトに変更されます。
残念ながら、誰かが提案する前に、Dust を削除して Knockout のみを使用するという選択肢は、現時点ではありません。