使用KnockoutJS中的自定义绑定更改绑定值

时间:2011-12-16 14:57:33

标签: knockout.js knockout-mapping-plugin

我有一个自定义绑定,用于截断可观察数组中的描述。我只是想知道更改返回绑定的文本的最佳方法。

    ko.bindingHandlers.summarize = { 
        init: function(element, valueAccessor, allBindingsAccessor, context) {
            var pattern = new RegExp(/^[^.]+/);
            var summarized = pattern.exec(context.description());
            //How do I set the text to the summarized value?
        }
    }

广泛的描述在页面的其他地方使用。此截断版本用于侧栏。打开关于更好的方法的建议,但这对我来说似乎是最好的方式。

viewModel是通过映射插件从JSON文件生成的,或者我只是直接在viewmodel中添加截断版本。

感谢你看一看。

2 个答案:

答案 0 :(得分:3)

这就是我所做的。一旦我查看淘汰图书馆的来源,这很简单。我强烈建议在库代码中进行挖掘。这对于学习是非常宝贵的。

ko.bindingHandlers.summarize = { 
    init: function(element, valueAccessor, allBindingsAccessor, context) {
    var pattern = new RegExp(/^[^.]+/);
    var summarized = pattern.exec(context.description());
    typeof element.innerText == "string" ? element.innerText = summarized
                                         : element.textContent = summarized;
    }
}

要在模板中使用它,您只需:

<p data-bind='summarize: description'></p>

描述将是可观察的。

答案 1 :(得分:0)

在您的示例中,您将自定义绑定与绑定语句data-bind='summarize: description'中的描述相关联,因此您可以使用valueAccessor参数来提高灵活性。

我更进一步使用ko.unwrap函数,因此您的自定义绑定也可以处理不可观察的值:

ko.bindingHandlers.summarize = { 
    init: function(element, valueAccessor, allBindingsAccessor, context) {
    var pattern = new RegExp(/^[^.]+/);
    var summarized = pattern.exec(ko.unwrap( valueAccessor() ) );
    typeof element.innerText == "string" ? element.innerText = summarized
                                         : element.textContent = summarized;
    }
}