Javascript 当我单击使用observableArray显示的href标记时,UI不会刷新
我的问题是,当我单击使用ObservalArray显示的href标记时,它不会刷新我的UI。我必须使用列表控件 我有一个列表控件,显示6个文件夹,然后是一个表,显示同样的6个文件夹和6个href标记。当我在listbox控件中更改选择时,文件会被刷新,非常容易和顺利。但是,我想/需要使用href标记刷新这些文件。如果有人有任何答案,请告诉我 我从以下位置获取了示例中的大部分代码:Javascript 当我单击使用observableArray显示的href标记时,UI不会刷新,javascript,knockout.js,Javascript,Knockout.js,我的问题是,当我单击使用ObservalArray显示的href标记时,它不会刷新我的UI。我必须使用列表控件 我有一个列表控件,显示6个文件夹,然后是一个表,显示同样的6个文件夹和6个href标记。当我在listbox控件中更改选择时,文件会被刷新,非常容易和顺利。但是,我想/需要使用href标记刷新这些文件。如果有人有任何答案,请告诉我 我从以下位置获取了示例中的大部分代码: Java脚本文件“proto.js”: var文件夹=[ {name:“文件夹3”,文件名:[“文件3\u 1”,
Java脚本文件“proto.js”:
var文件夹=[
{name:“文件夹3”,文件名:[“文件3\u 1”,“文件3\u 2”,“文件3\u 3']},
{name:“文件夹4”,文件名:[“文件4_1”,“文件4_4”,“文件4_2”,“文件4_3'],
{name:“文件夹5”,文件名:[“文件5_1”,“文件5_4”,“文件5_5”,“文件5_2”,“文件5_3'],
{name:“文件夹6”,文件名:[“文件6_1”,“文件6_4”,“文件6_6”,“文件6_5”,“文件6_2”,“文件6_3'],
{name:“文件夹2”,文件名:['File 2_2','File 2_1']},
{name:“文件夹1”,文件名:['File 1_1']}
];
var FileExplorerViewModel=函数(列表,selectedList){
this.folders=ko.observearray(列表);
this.editingList={
名称:ko.observable(selectedList),
文件名:ko.observearray()
};
this.changeFolder=ko.computed({
读:函数(){
警报(“更改文件夹:读取”);
返回此.editingList;
},
写入:函数(文件夹){
警报(“更改文件夹:写入”);
警报(文件夹名称);
if(文件夹&&this.editingList){
警报(“更改文件夹:写入执行”);
selectedList=folder.name;
}
},
所有者:此//FileExplorerViewModel
},这个);
this.sortFolders=函数(){
this.folders.sort(函数(a,b){
返回a.name
HTML文件:“proto.HTML”
文件浏览器原型
对文件夹排序
当前正在查看文件夹中的文件:
排序文件
-
您的changeFolder在写入时所做的一切都是
selectedList=folder.name
,但这不会影响任何其他内容。。我想你可能想做:this.editingList.name(folder.name)
。下面是它的工作原理:
这是可行的,但只要稍作修改就可以简单得多。不要以当前正在工作的文件夹的名称为基础,而要以文件夹本身为基础。您应该很少需要使用
选项value
绑定,因为使用它意味着覆盖默认功能,即KO将每个选项映射到实际对象,并使用实际对象标识作为“值”。我还将computed更改为simple subscribe,并简化了changeFolder
函数-它没有理由是可写的computed。更新的小提琴:感谢您的建议和示例,Antishok。我看到并测试了您在JSFIDLE中创建的示例,这非常有用。它正按照我需要的方式工作。
var folders = [
{ name: "Folder 3", fileNames: ['File 3_1', 'File 3_2', 'File 3_3']},
{ name: "Folder 4", fileNames: ['File 4_1', 'File 4_4', 'File 4_2', 'File 4_3'] },
{ name: "Folder 5", fileNames: ['File 5_1', 'File 5_4', 'File 5_5', 'File 5_2', 'File 5_3'] },
{ name: "Folder 6", fileNames: ['File 6_1', 'File 6_4', 'File 6_6', 'File 6_5', 'File 6_2', 'File 6_3'] },
{ name: "Folder 2", fileNames: ['File 2_2', 'File 2_1'] },
{ name: "Folder 1", fileNames: ['File 1_1'] }
];
var FileExplorerViewModel = function (lists, selectedList) {
this.folders = ko.observableArray(lists);
this.editingList = {
name: ko.observable(selectedList),
fileNames: ko.observableArray()
};
this.changeFolder = ko.computed({
read: function () {
alert("changeFolder: Read");
return this.editingList;
},
write: function (folder) {
alert("changeFolder: write");
alert(folder.name);
if (folder && this.editingList) {
alert("changeFolder: Write executing");
selectedList = folder.name;
}
},
owner: this //FileExplorerViewModel
}, this);
this.sortFolders = function () {
this.folders.sort(function (a, b) {
return a.name < b.name ? -1 : 1;
});
};
this.sortFiles = function () {
this.editingList.fileNames.sort(function (a, b) {
return a < b ? -1 : 1;
});
};
this.findSavedList = function (name) {
var lists = this.folders();
return ko.utils.arrayFirst(lists, function (list) {
return list.name === name;
});
};
ko.computed(function () {
//alert("ko.computed");
// Observe viewModel.editingList.name(), so when it changes (i.e., user selects a different list) we know to copy the saved list into the editing list
var savedList = this.findSavedList(this.editingList.name());
if (savedList) {
var userNamesCopy = savedList.fileNames.slice(0);
this.editingList.fileNames(userNamesCopy);
} else {
this.editingList.fileNames([]);
}
}, this);
};
$(document).ready(function () {
ko.applyBindings(new FileExplorerViewModel(folders, "Folder 4"));
});
<!
DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta charset="UTF-8" />
<title>File Explorer Prototype</title>
<link rel="stylesheet" type="text/css" href="css/jquery.mobile-1.1.0.css" />
<script type="text/javascript" src="../cordova-1.6.0.js"></script>
<script type="text/javascript" src="../jquery-1.7.2.min.js"></script>
<script type="text/javascript" src="scripts/knockout-2.0.0.js"></script>
<script type="text/javascript" src="Proto.js"></script>
</head>
<body class="homeBody">
<div class='listChooser'>
<!--<button data-bind='click: deleteList, enable: editingList.name'>Delete</button>
<button data-bind='click: saveChanges, enable: hasUnsavedChanges'>Save</button>-->
<!--<select data-bind='options: folders, optionsValue: "name", value: editingList.name'> </select>-->
<select multiple="multiple" data-bind="options: folders, optionsValue: 'name', value: editingList.name"></select>
<button data-bind='click: $root.sortFolders'>Sort Folders</button>
<table>
<tbody data-bind="foreach: folders">
<tr><td>
<span data-bind="text: name"></span>
<a href="#" data-bind="click: $root.changeFolder">Change</a>
<!--<a data-bind="attr: {href: name}, click: $root.changeFolder">Change Folder</a>-->
<br />
</td></tr>
</tbody>
</table>
</div>
<p>Currently viewing <b><font color="red"><span data-bind='text: editingList.fileNames().length'></span></font></b> file(s) from folder <b><font color="red"><span data-bind="text: editingList.name"></span></font></b>:</p>
<button data-bind='click: $root.sortFiles'>Sort Files</button>
<div data-bind='with: editingList'>
<ul data-bind='foreach: fileNames'>
<li>
<div data-bind="text: $data"> </div>
</li>
</ul>
</div>
</body>
</html>