敲除自定义绑定如何与observableArray一起使用?当使用带有自定义绑定的ko.observable()时,一切都按预期工作.使用ko.observableArray()时,仅抛出初始事件(init和update one),但未检测到进一步的更改(请参阅下面的Fiddle或代码).
<!DOCTYPE html>
<html>
<head>
<script type="text/javascript" src="knockout-2.2.1.js"> </script>
</head>
<body>
<div data-bind="text: Observable, updateBinding: Observable"></div>
<div data-bind="foreach: ObservableArray, updateBinding: ObservableArray">
<span data-bind="text: $data"></span>
</div>
<script type="text/javascript">
ko.bindingHandlers['updateBinding'] = {
init: function (element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
alert("Binding Handler (Init)");
},
update: function (element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
alert("Binding Handler (Update)");
}
};
function ViewModel() {
var self = this;
self.ObservableArray = ko.observableArray();
self.Observable = ko.observable();
}
var viewModel = new ViewModel();
// Fires Init …Run Code Online (Sandbox Code Playgroud) 我有一个自定义绑定来处理自动完成,当用户从自动完成中选择一个项目时,我会与服务器通信并用缩短的名称替换text_field.问题是这会第二次触发我的自定义绑定的"更新"功能.
Knockout.js代码(编辑:注意以下是CoffeeScript):
ko.bindingHandlers.ko_autocomplete =
init: (element, params) ->
$(element).autocomplete(params())
update: (element, valueAccessor, allBindingsAccessor, viewModel) ->
unless task.name() == undefined
$.ajax "/tasks/name",
data: "name=" + task.name(),
success: (data,textStatus, jqXHR) ->
task.name(data.short_name)
Task = ->
@name = ko.observable()
@name_select = (event, ui) ->
task.name(ui.item.name)
false
task = Task.new()
Run Code Online (Sandbox Code Playgroud)
视图
= f.text_field :name, "data-bind" => "value: name, ko_autocomplete: { source: '/autocomplete/tasks', select: name_select }"
Run Code Online (Sandbox Code Playgroud)
有没有办法将油门应用于自定义绑定?
我只想在将task.name设置为从服务器发回的short_name时再次触发自定义绑定'更新'功能.
我们在optionsCaption绑定方面遇到常见问题:即使只有一个元素也会显示它.我们使用自定义绑定解决了这个问题:
ko.bindingHandlers.optionsAutoSelect = {
update: function (element, valueAccessor, allBindingsAccessor) {
var value = ko.utils.unwrapObservable(valueAccessor());
var allBindings = allBindingsAccessor();
if (value.length == 1) {
allBindings.optionsCaption = null;
}
ko.bindingHandlers.options.update(element, valueAccessor, allBindingsAccessor);
}
};
Run Code Online (Sandbox Code Playgroud)
在更新到knockout 3.0之后,allBindings变为readonly.因此,任何更改都会被跳过.任何想法如何在ko 3.0中解决?我们确实有很多这样的自动选择,并且不想在所有视图上复制粘贴一些计算代码.所以我们想要一些单选项/扩展点.不幸的是,因为我可以看到选项绑定是相当单一的.
我想创建一个自定义绑定作为添加其他绑定的简写 - 如宏.
<div data-bind="foo: 1"></div>
Run Code Online (Sandbox Code Playgroud)
应该做同样的事情
<div data-bind="click: clickHandler, css: { someClass: someObservable }, ...">
</div>
Run Code Online (Sandbox Code Playgroud)
就像是:
ko.bindingHandlers.foo = {
init: function(el,val,bindings,model,context) {
// some way to add { click: clickHandler } to bindings()
}
}
Run Code Online (Sandbox Code Playgroud) 有没有办法从自定义绑定内部绑定元素?例如,我有自定义绑定并绑定到它可观察的项目数组:
var someArrayOfItems = ko.observableArray(['item1', 'item2', 'item3']);
...
<div data-bind="myBinding: someArrayOfItems"></div>
Run Code Online (Sandbox Code Playgroud)
现在我希望myBinding列出它被绑定的div元素中的'someArrayOfItems'中的所有元素:
<ul data-bind="foreach: someArrayOfItems">
<li>
<span data-bind="text: $data"></span>
</li>
</ul>
Run Code Online (Sandbox Code Playgroud)
是否可以使用自定义绑定进行此类操作?谢谢你的帮助.
我试图创建一个自定义绑定,以显示文本输入中的提示文本.
到目前为止,我有这个,但它不起作用:
ko.bindingHandlers.hintText= {
init: function (element, valueAccessor) {
element.focus(function () {
if ($(this).val() === defaultText) {
$(this).attr("value", "");
}
});
element.blur(function () {
if ($(this).val() === '') {
$(this).val(valueAccessor());
}
});
}
}
Run Code Online (Sandbox Code Playgroud)
html:
<input id="profileID" type="text" data-bind="hintText:'Enter Profile ID'" />
Run Code Online (Sandbox Code Playgroud)