Dust.js会在渲染时覆盖Knockout observable

时间:2012-08-09 14:57:38

标签: javascript knockout.js dust.js

我在项目中使用Dust.jsKnockout.js,使用名为Duster-KO的模块来集成两者。当我尝试在客户端渲染灰尘模板时会出现问题:当我将一个observable或任何包含observable的对象传递给Context参数中的dust.render()时,Dust实际上将KO可观察性设置为“块”对象。我相信这是因为Knockout observables是函数,所以Dust认为我传递它的函数是一个回调而不是一个observable,它然后执行并以某种方式设置observable那样。

有没有办法避免这个问题,或以其他方式阻止尘埃触及可观察物?

以下是我遇到的情况示例:

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)
  }
}

在上面的例子中,在我渲染灰尘模板之前,每个客人的名字和姓氏都是完整的,因为它们应该是。但是,之后它们将更改为Chunk对象。

在有人建议之前,不幸的是,删除Dust并仅使用Knockout不是一种选择。

1 个答案:

答案 0 :(得分:1)

你是否应用了Duster-Ko自述文件中提到的黑客???

  

为什么尘埃破解:(

     

不愉快的生意,那。

     

Dust期望任何功能标签接受一组参数(块,   上下文)。我们可以为每个KO构建一个防尘包装   观察者,并从这些中构建Dust上下文,但这似乎是一个   很多不必要的对象创建。

     

相反,我们只是破坏尘埃,不像通常那样评价观察者   会,并用更多的股票标准来处理后果   辅助过滤器。

     

来源

     

这些更改是在你正在使用的任何灰尘中完成的。

     

Prime hackery:

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模板&咳嗽评估   那。要手动调用模板,我们需要传入Dust Chunk   对象,通常我们不会接触到,所以:

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

针对未指明的粉尘源(目前,dust-core-0.3.0.js是   预定目标)。