1

プロジェクトでDust.jsKnockout.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 のみを使用するという選択肢は、現時点ではありません。

4

1 に答える 1

1

Duster-Ko Readme ファイルに記載されているハックを適用しましたか???

ダストハックの理由 :(

不快なビジネス、それ。

Dust は、機能タグが一連のパラメーター (チャンク、コンテキスト) を受け入れることを期待しています。すべての KO オブザーバー用にダスト フレンドリーなラッパーを構築し、これらからダスト コンテキストを構築することもできますが、それは非常に多くの不要なオブジェクトの作成のように思えます。

代わりに、通常のように Observer を評価しないように Dust をハックし、より標準的なヘルパー フィルターで余波を処理します。

起源

これらの変更は、使用している Dust*js で行われます。

プライムハッカリー:

Chunk.prototype.reference = function(elem, context, auto, filters) {
-  if (typeof elem === "function") {
+  if (typeof elem === "function" && elem.name != "observable") {
     elem = elem(this, context, null, {auto: auto, filters: filters});`

ああ、また、いくつかのダスト テンプレートを手動で呼び出して、それを評価しています。テンプレートを手動で呼び出すには、Dust Chunk オブジェクトを渡す必要があります。これは通常は公開されないため、次のようになります。

+dust.chunk= Chunk Tis all! Checkout lib/dust-patch.js for a patch 

不特定のダストソースに対して (現時点では、dust-core-0.3.0.js が意図されたターゲットです)。

于 2012-08-17T15:16:14.340 に答える