【发布时间】:2014-03-03 14:31:25
【问题描述】:
在淘汰 JS 方面遇到更多问题,希望有人能够帮助我。 (我不得不问关于 Knockout 的大量问题,我想知道我是否应该坚持使用 jQuery)
我正在尝试使用两个或三个选项动态创建单选按钮列表。每行是一组单独的按钮。
我可以写出清单,但我很难找到合适的清单来检查或不检查。
我的 HTML 是:
<div data-bind="with: functions" id="ActionWindow">
<h2>bob<span data-bind="text: pgroupname"></span></h2>
<h2>Read & Update Functions</h2>
<div>
<table>
<thead class="FunctionsTableHead">
<tr>
<th class="FunctionName">Function</th>
<th>None</th>
<th>Read</th>
<th>Write</th>
</tr>
</thead>
<tbody class="FunctionsTable" data-bind="foreach: pReadFunctions">
<tr>
<td class="FunctionName" data-bind="text: FunctionName"></td>
<td><label><input type="radio" data-bind="attr: { name: FunctionNum + '-ReadAccessLevel'}, checkedValue: 0, checked: AccessLevel" /></label></td>
<td><label><input type="radio" data-bind="attr: { name: FunctionNum + '-ReadAccessLevel'}, checkedValue: 1, checked: AccessLevel" /></label></td>
<td><label><input type="radio" data-bind="attr: { name: FunctionNum + '-ReadAccessLevel'}, checkedValue: 2, checked: AccessLevel" /></label></td>
</tr>
</tbody>
</table>
</div>
<h2>Action Functions</h2>
<table>
<thead class="FunctionsTableHead">
<tr>
<th class="FunctionName">Function</th>
<th>None</th>
<th>Action</th>
</tr>
</thead>
<tbody class="FunctionsTable" data-bind="foreach: pActionFunctions">
<tr>
<td class="FunctionName" data-bind="text: FunctionName"></td>
<td><label><input type="radio" data-bind="attr: { name: FunctionNum + '-ActionAccessLevel'}, checkedValue: 0, checked: AccessLevel" /></label></td>
<td><label><input type="radio" data-bind="attr: { name: FunctionNum + '-ActionAccessLevel'}, checkedValue: 1, checked: AccessLevel" /></label></td>
</tr>
</tbody>
</table>
我为这两个单选按钮列表尝试了两种不同的方法,但都没有奏效:
<script type="text/javascript">
//slide animation for lefthand menu
$('.ListDeptLink').click(function () {
$(this).nextAll('.SectListDiv').first().slideToggle(500);
});
$('.ListSectLink').click(function () {
var url = '@Url.Action("DisplayGroup", "AjaxGroup")' + '?GroupId=' + $(this).attr("GroupId") + "&GroupName=" + encodeURIComponent($(this).attr("GroupName"));
$.ajax({
url: url,
contentType: "application/json; charset=utf-8",
type: 'POST',
context: this,
timeout: 60000,
dataType: 'json',
tryCount: 0,
retryLimit: 3,
success: function (data) {
viewModel.functions(new functionsModel(data))
},
error: function (httpRequest, textStatus, errorThrown) {
alert("Error");
}
});
});
function functionsModel(data) {
this.pgroupname = ko.observable(data ? data.GroupName : "");
this.FunctionNum = data ? data.FunctionNum : "";
this.AccessLevel = data ? data.AccessLevel : "";
this.pReadFunctions = ko.observableArray((data ? data.ReadFunctionList : [])
.map(function (item) {
return {
FunctionNum: item.FunctionNum,
FunctionName: item.FunctionName,
AccessLevel: ko.observable(item.AccessLevel)
};
})
);
this.pActionFunctions = ko.observableArray((data ? data.ActionFunctionList : [])
.map(function (item) {
return {
FunctionNum: item.FunctionNum,
FunctionName: item.FunctionName,
AccessLevel: ko.observable(item.AccessLevel)
};
})
);
};
var wrapper = function () {
this.functions = ko.observable(new functionsModel(null));
};
var viewModel = new wrapper();
ko.applyBindings(viewModel);
最后是返回数据的示例:
ReadFunctionList":[],"ActionFunctionList": [{"FunctionNum":582,"FunctionName":"Name1","FunctionType":Ignorethis,"GroupNum":1,"AccessLevel":0},{"FunctionNum":502,"FunctionName":"Name2","FunctionType":IgnoreThis,"GroupNum":2,"AccessLevel":0},"GroupName":"Name1"}
AccessLevel 决定了应该勾选哪个,所以在这个例子中,两个项目都应该勾选第一个单选按钮。
提前感谢您的帮助:)
编辑:我已经更新了到目前为止的代码
【问题讨论】:
-
一个显示问题的工作 jsfiddle 会很棒
-
我正在努力,但我什至无法让 JS Fiddle 填充行:jsfiddle.net/dariune/sYTF7
-
您的第一个问题是您没有遵循淘汰赛应遵循的任何设计模式。您正在混合敲除和 jQuery,并使用 jQuery 来做应该用敲除处理的事情。我强烈建议您遵循淘汰教程并像那里一样构建您的代码。
-
看看你的包装函数。您创建一个 observableArray 然后用非数组值填充,删除第二行。与成功回调相同。那确实应该将一个新值推入 observableArray -> viewModel.functions.push(new functionsModel(data)) ;
-
在让 jsFiddle 工作方面,将 click 事件中的 AJAX 调用替换为对 viewModel.functions 的直接分配......此外,JQuery 将点击处理程序连接到的元素在哪里.您还缺少从包装器到函数的绑定(“foreach:functions”?)
标签: jquery asp.net-mvc knockout.js