我在我的SharePoint 2010项目中使用带有SP服务库的knockout js。我试图为其中一个字段实现自动完成功能。这是我的代码:
这是如何查看我的输入字段:
<input id="newTask" title="task" data-bind="value: newTask" placeholder="Add new task" />
<button data-bind="click: addTask" class="btn">
这是我的ViewModel.js:
(function() {
function Task(data) {
this.Tasks = ko.observable(data.Tasks);
/*other fields*/
}
function TaskListViewModel() {
var ctx = new SP.ClientContext(_spPageContextInfo.webServerRelativeUrl);
var web = ctx.get_web();
var taskList = web.get_lists().getByTitle("Tasks");
// Data
var self = this;
self.taskInformation = ko.observableArray([]);
self.newTask = ko.observable();
/*other fields*/
self.addTask = function() {
self.taskInformation.push(new Task(
{
Tasks: this.newTask(),
/*other fields*/
}));
self.newTask("");
};
var taskListViewModel;
$(document).ready(function() {
EnsureScriptFunc("sp.js", "SP.ClientContext", function() {
taskListViewModel = new TaskListViewModel();
ko.applyBindings(taskListViewModel );
});
});
})();
我的View.html文件中的此脚本:
<script type="text/javascript">
$(document).ready(function() {
$('#newTask').on('input propertychange paste', function (e) {
var val = $(e.currentTarget).val();
viewModel.newTask(val);
});
// Init
viewModel = new taskListViewModel();
ko.applyBindings(viewModel, document.getElementById("parent-container"));
$().SPServices.SPAutocomplete({
sourceList: "Bidders",
sourceColumn: "Title",
columnName: "task",
ignoreCase: true,
numChars: 3,
slideDownSpeed: 1000,
debug: true
});
});
</script>
自动完成工作,但新添加的任务仅包含键入的字符。例如:我键入Mic(自动完成为Microsoft提供选项),当我选择此选项并单击添加时,它只需要Mic。
答案 0 :(得分:0)
您需要手动触发输入以告知敲除输入已被操作。
<input id="newTask" title="task" data-bind="value: newTask" placeholder="Add new task" />
$('#newTask').on('input propertychange paste', function (e) {
var val = $(e.currentTarget).val();
viewModel.newTask(val);
});
// Init
viewModel = new TaskList();
ko.applyBindings(viewModel , document.getElementById("parent-container"));
进一步编辑
var _taskList;
$(document).ready(function() {
EnsureScriptFunc("sp.js", "SP.ClientContext", function() {
_taskList = new TaskListViewModel();
ko.applyBindings(_taskList);
});
$('#newTask').on('input propertychange paste', function (e) {
var val = $(e.currentTarget).val();
_taskList.newTask(val);
});
});
答案 1 :(得分:0)
由于您正在使用value
绑定,因此仅在模糊的视图模型中更新可观察值。如果你正在使用KO 3.2+,你应该使用textInput
绑定,它会立即更新observable。
如果您不这样做,则应考虑升级。我发现使用jQuery事件(如tyler_mitchell所建议的那样)并不像我希望的那样可靠。但是,如果你没有升级,这就是你要走的路。
答案 2 :(得分:0)
我已经在我的输入元素
上做了这个 <input data-bind="textInput: task, valueUpdate:'blur'"/>
并且只在IE11中有效。我的客户使用ie,所以我对这种方法感到满意。