Knockout:在foreach循环中使用select会在所有选择中选择相同的精确值

时间:2015-07-03 19:44:57

标签: javascript c# asp.net-mvc knockout.js knockout-3.0

我刚刚开始(实际上我的第一个项目)使用Knockout并且非常喜欢它。

但是我遇到了一个问题,我似乎无法自行解决。

我有一个选择下拉列表在另一个foreach循环中运行。

一切看起来都不错,但是当我在其中一个下拉列表中选择时,它会自动在所有下拉列表中选择相同的值。

例如,如果我选择“删除”值,则该“foreach”中的所有下拉列表将在“删除”值上被选中。

我真的很感谢帮助这个。

这是相关的JavaScript(在FoldersFileBrowserViewModel中有更多内容,但我删除了多余的代码)和HTML代码

提前谢谢。

/// <reference path="jquery-2.1.4.min.js" />
/// <reference path="knockout-3.3.0.debug.js" />

$(document).ready(function () {
	function FoldersFileBrowserViewModel() {
		var self = this;

		
		//actions drop down
		self.itemActions = ko.observableArray([{ ActionName: 'Remove' }, { ActionName: 'Move' }]);		
		self.selectedAction = ko.observable();

		var subscription = self.selectedAction.subscribe(function (newValue) {
			console.log(newValue.ActionName);
			//alert(self.selectedAction().ActionName);
			/* do stuff */
		});
		// ...then later...
		//subscription.dispose(); // I no longer want notification
		
	}

	ko.applyBindings(new FoldersFileBrowserViewModel());	
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script>

<tbody data-bind="foreach: filesInFolder" style="border-top:none;">
		<tr>
			<td></td>
			<td class="color-blue">
				<input type="checkbox" />
				<img src="~/Images/icons/Document-copy-icon.png" alt="file" />
				<span style="font-weight:500; color:#555;" data-bind="text: FileName"></span>
				@*<input type="hidden" data-bind="text: FilePath">*@
			</td>
			<td></td>
			<td>
				@*value: $root.selectedAction,*@
				<select data-bind="options: $root.itemActions, optionsText: 'ActionName', value: $root.selectedAction, optionsCaption: '- Select Action -'"></select>								
				<button data-bind="click: $parent.RemoveFile" style="background-color:transparent; border:none;">
					<img src="~/Images/icons/window-app-list-close-icon.png" alt="delete file" />
				</button>
			</td>
		</tr>
	</tbody>	

1 个答案:

答案 0 :(得分:2)

您需要为每个fileInfolder包装每个选定的操作

基于您的代码中的类似内容:

$(document).ready(function () {

var File = function (file) {
    var self = this;
    /* some fields*/
    self.FileName = ko.observable( file ? file.FileName : '');
    self.FilePath = ko.observable( file ? file.FilePath : '');
    self.selectedAction = ko.observable(file ? file.selectedAction : undefined);

    var subscription = self.selectedAction.subscribe(function (newValue) {
        console.log(newValue); // Log selectedAction here comes the optionsValue field 
        //alert(self.selectedAction().ActionName);
        /* do stuff */
    });
    // ...then later...
    //subscription.dispose(); // I no longer want notification
}
function FoldersFileBrowserViewModel() {
    var self = this;


    //actions drop down are ok here load them only once if are the same :)
    self.filesInFolder = ko.observableArray();
    self.itemActions = ko.observableArray([{ ActionName: 'Remove' }, { ActionName: 'Move' }]);      

    self.filesInFolder.push(new File({ FileName : 'File1' }));// just to add some stuff to test
}
ko.applyBindings(new FoldersFileBrowserViewModel());
});

HTML:

<table>
<tbody data-bind="foreach: { data: filesInFolder , as: 'file' }" style="border-top:none;">
    <tr>
        <td></td>
        <td class="color-blue">
            <span style="font-weight:500; color:#555;" data-bind="text: FileName"></span>
            <input type="hidden" data-bind="text: FilePath">
        </td>
        <td></td>
        <td>
            <select data-bind="options: $root.itemActions, optionsText: 'ActionName', optionsValue: 'ActionName', value: selectedAction, optionsCaption: '- Select Action -'"></select>                             
        </td>
    </tr>
</tbody>    

抱歉,我总是使用此编辑器&gt;。&lt;