我在项目中使用Dust.js和Knockout.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不是一种选择。
答案 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是 预定目标)。