Loading [MathJax]/jax/input/TeX/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在Knockout JS中绑定和检查无线电按钮

在Knockout JS中绑定和检查无线电按钮
EN

Stack Overflow用户
提问于 2014-03-03 06:31:25
回答 2查看 1.3K关注 0票数 0

有更多的问题淘汰赛JS,并希望有人能够帮助我。(我问了那么多关于淘汰赛的问题,我想知道我是否应该坚持使用jQuery)。

我试图动态地创建一个单选按钮列表,其中包含两个或三个选项。每一行都是一组独立的按钮。

我可以把清单写好,但我很难找到合适的。

我拥有的HTML是:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<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>

对于两个单选按钮列表,我尝试了两种不同的方法,但这两种方法都没有奏效:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<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);

最后是数据返回的一个例子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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是决定哪一个应该勾选的东西,所以在这个例子中,两个项目都应该有第一个无线电按钮。

(谢谢您的帮助:)

编辑:我已经用到目前为止的位置更新了代码

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-03-03 17:38:45

Javascript发布

我认为包装器中的函数应该是可观察的,而不是observableArray。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var wrapper = function () {
    this.functions= ko.observable(new functionsModel(null));
};

您的pReadFunction和pActionFunction项应该具有可观察到的AccessLevel属性。您将不会从将单选按钮更改为视图模型中获得更新。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// Inside $('.ListSectLink').click
this.pReadFunctions = ko.observableArray( (data ? data.ReadFunctionList : [] )
    .map( function(item) {
        return {
            FunctionNum: item.FunctionNum,
            FunctionName: item.FunctionName,
            FunctionType: item.FunctionType,
            GroupNum: item.GroupNum,
            AccessLevel: ko.observable(item.AccessLevel)
        }; 
    })
);

// Repeat for pActionFunctions

在您的jsFiddle中,不要在单击处理程序中使用AJAX调用,只需直接分配示例数据。如果您真的想模拟异步回调,请使用$.Deferred / resolveWith。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$('.ListSectLink').click(function () {
    var testData = ...
    viewModel.functions( new functionsModel(testData) );
});

$('.ListSectLink').click(function () {
    var testData = ...
    var deferred = $.Deferred();
    deferred.done( function(data) {
        this.functions( new functionsModel(data) );
    });

    setTimeout( function() {
        deferred.resolveWith(viewModel, [testData]);
    }, 100);

});

HTML/绑定问题

在您的jsFiddle中,它缺少包装器->函数绑定。这可能就是为什么样本不能工作的原因。假设是这样的。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<div data-bind="with: functions" />

输入无线电检查绑定不应针对$root。这将是示例中的包装器实例。给定示例JSON,AccessLevel位于每个ReadFunctionList和ActionFunctionList数组项上,因此对选中的数据绑定使用"$data.AccessLevel“(或仅使用"AccessLevel”)。

选中的绑定将与元素的值和可观察的支持值进行比较。但是元素的绑定是一个字符串,但是在示例JSON中它是一个数字。这不相配。添加一个checkedValue数据绑定表达式,以覆盖每个单选按钮的“值”为数字。

您还需要为pReadFunction单选按钮使用名称attr绑定,就像对pActionFunction单选按钮一样,将每一行分组为一组。您还可以考虑在Read和Action中添加另一个前缀,以防FunctionNum在这两个集合之间不是唯一的。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<input type="radio" data-bind="
    attr: { name: 'Action-' + FunctionNum + '-AccessLevel'}, 
    checkedValue: 0,
    checked: AccessLevel" />

<input type="radio" data-bind="
    attr: { name: 'Action-' + FunctionNum + '-AccessLevel'}, 
    checkedValue: 1,
    checked: AccessLevel" />

加成积分

您还可以使用单击绑定而不是使用jQuery。click函数将是包装类上的函数。您需要传递Url,因为它看起来是生成服务器端的。我用一个按钮连接这个例子的数据绑定。您可能需要帮助剃须刀引擎在数据绑定属性中解决客户端和服务器端的问题。我将把它作为练习留给读者;)

这里的好处是,所有的模型操作都包含在viewModel中。还请注意click数据绑定表达式上的bind语句。这就是将参数转化为函数的方式。如果“包装器”不是根对象,则可能需要根据实际应用程序绑定/视图模型结构将其更改为$data或$parent。在jsFiddle中,它将起作用。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<button data-bind="click: getListSectLink.bind($root, @Url.Action(...)">Get</button>

function wrapper() {
    this.functions = ko.observable( new FunctionsModel(null ) );
    this.getListSectLink = function(url) {
         // ajax stuff
         success: function(data) {
             this.functions( new functionsModel(data) );
         }
    };
}
票数 1
EN

Stack Overflow用户

发布于 2014-03-03 17:51:34

问题是,Knockout使用一个精确的比较来确定要选择哪个单选按钮,并且您正在绑定到一个整数checked值,同时给单选按钮一个字符串attr值。解决方案是使用checkedValue绑定(而不是attr)给单选按钮一个整数值:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<input type="radio" data-bind="checkedValue: FunctionNum, checked: $root.AccessLevel" />

参考资料:http://knockoutjs.com/documentation/checked-binding.html#parameters

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22149370

复制
相关文章
Knockout.Js官网学习(html绑定、css绑定)
html绑定到DOM元素上,使得该元素显示的HTML值为你绑定的参数。如果在你的view model里声明HTML标记并且render的话,那非常有用。
aehyok
2018/09/11
2.5K0
Knockout.Js官网学习(html绑定、css绑定)
Knockout.Js官网学习(selectedOptions绑定、uniqueName 绑定)
selectedOptions绑定用于控制multi-select列表已经被选择的元素,用在使用options绑定的<select>元素上。
aehyok
2018/09/11
2.1K0
Knockout.Js官网学习(click绑定)
click绑定在DOM元素上添加事件句柄以便元素被点击的时候执行定义的JavaScript 函数。大部分是用在button,input和连接a上,但是可以在任意元素上使用。
aehyok
2018/09/11
3K0
Knockout.Js官网学习(click绑定)
Knockout.Js官网学习(options绑定)
options绑定控制什么样的options在drop-down列表里(例如:<select>)或者 multi-select 列表里 (例如:<select size='6'>)显示。此绑定不能用于<select>之外的元素。关联的数据应是数组(或者是observable数组),<select>会遍历显示数组里的所有的项。
aehyok
2018/09/11
1.7K0
Knockout.Js官网学习(options绑定)
Knockout.Js官网学习(value绑定)
value绑定是关联DOM元素的值到view model的属性上。主要是用在表单控件<input>,<select>和<textarea>上。
aehyok
2018/09/11
2.2K0
Knockout.Js官网学习(value绑定)
Knockout.Js官网学习(text绑定)
text 绑定到DOM元素上,使得该元素显示的文本值为你绑定的参数。该绑定在显示<span>或者<em>上非常有用,但是你可以用在任何元素上。
aehyok
2018/09/11
2.1K0
Knockout.Js官网学习(checked 绑定)
checked绑定是关联到checkable的form表单控件到view model上 - 例如checkbox(<input type='checkbox'>)或者radio button(<input type='radio'>) 。当用户check关联的form表单控件的时候,view model对应的值也会自动更新,相反,如果view model的值改变了,那控件元素的check/uncheck状态也会跟着改变。
aehyok
2018/09/11
2.2K0
Knockout.Js官网学习(checked 绑定)
Knockout.Js官网学习(enable绑定、disable绑定)
enable绑定使DOM元素只有在参数值为 true的时候才enabled。在form表单元素input,select,和textarea上非常有用。
aehyok
2018/09/11
2.3K0
Knockout.Js官网学习(enable绑定、disable绑定)
Knockout.Js官网学习(event绑定、submit绑定)
event绑定在DOM元素上添加指定的事件句柄以便元素被触发的时候执行定义的JavaScript 函数。大部分情况下是用在keypress,mouseover和mouseout上。
aehyok
2018/09/11
2.6K0
Knockout.Js官网学习(event绑定、submit绑定)
Knockout.Js官网学习(style绑定、attr绑定)
style绑定是添加或删除一个或多个DOM元素上的style值。比如当数字变成负数时高亮显示,或者根据数字显示对应宽度的Bar。(注:如果你不是应用style值而是应用CSS class的话,请参考CSS绑定。)
aehyok
2018/09/11
4K0
Knockout.Js官网学习(style绑定、attr绑定)
Knockout.Js官网学习(visible绑定)
让visible绑定到DOM元素上,使得该元素的hidden或visible取决于绑定的值。
aehyok
2018/09/11
1.6K0
Knockout.Js官网学习(创建自定义绑定)
你可以创建自己的自定义绑定 – 没有必要非要使用内嵌的绑定(像click,value等)。你可以你封装复杂的逻辑或行为,自定义很容易使用和重用的绑定。例如,你可以在form表单里自定义像grid,tabset等这样的绑定。
aehyok
2018/09/11
8090
Knockout.Js官网学习(创建自定义绑定)
Knockout.js是什么?
从本节开始介绍关于KnockoutJs相关的内容,本节主要介绍knockoutjs一些重要特性与优点,以及它与Jquery等框架库之间的区别。 1、Knockout.js是什么? Knockout是一款很优秀的JavaScript库,它可以帮助你仅使用一个清晰整洁的底层数据模型(data model)即可创建一个富文本且具有良好的显示和编辑功能的用户界面。任何时候你的局部UI内容需要自动更新(比如:依赖于用户行为的改变或者外部的数据源发生变化),KO都可以很简单的帮你实现,并且非常易于维护。 2、KO重要特
MonroeCode
2018/02/09
5.6K0
文本、图片和按钮在Flutter中怎么用
与iOS、Android和React类似,作为一个UI框架,Flutter自然也提供了很多UI控件。而文本、图片和按钮,则是这些不同的UI框架中构建视图都要用到的三个最基本的控件。
拉维
2019/08/12
7.8K0
文本、图片和按钮在Flutter中怎么用
scrapy在cmd中检查
1,scrapy shell 2,fetch('http://gk.scsn.gov.cn/Search.aspx?columnId=40012') 抓取网页 3。response.xpath('//
Centy Zhao
2019/12/26
7660
Knockout.Js官网学习(简介)
最近一段时间在网上经常看到关于Knockout.js文章,于是自己就到官网看了下,不过是英文的,自己果断搞不来,借用google翻译了一下。然后刚刚发现在建立asp.net mvc4.0的应用程序的时候,建完之后我直接在项目的Scripts中看到了
aehyok
2018/09/11
2.3K0
Knockout.Js官网学习(简介)
Extjs中弹出框动态绑定form和按钮
按钮的其他设置,雷同,直接把ref改为其他属性,即可。其他的标题,窗体大小之类的直接看api,就不用说了。如果还有不动的请主动联系我。运行之后的效果图这里就不截图了。
业余草
2019/01/21
1.7K0
Knockout.Js官网学习(数组observable)
  如果你需要探测和响应一个集合对象的变化,你应该用observableArray 。
aehyok
2018/09/11
1.3K0
在 Kubernetes 中检查镜像签名
之前连续写了几篇 Shell Operator 的东西,后来又写了一篇 cosign 的介绍,细心的读者可能会猜到,最终我的目的就是会用 Shell Operator 结合 cosign 来检查镜像的签名,以此保障镜像的完整性——是的,这个过程相当容易。
崔秀龙
2021/04/25
1.2K0
Knockout.Js官网学习(Mapping插件)
  Knockout设计成允许你使用任何JavaScript对象作为view model。必须view model的一些属性是observable的,你可以使用KO绑定他们到你的UI元素上,当这些observable值改变的时候,这些UI元素就会自动更新。
aehyok
2018/09/11
1.5K0
Knockout.Js官网学习(Mapping插件)

相似问题

knockout js if绑定和脚本

20

在knockout js上执行不是真的检查绑定?

32

knockout js中的无线电验证

12

如何基于绑定值在Knockout.js中隐藏按钮

34

Knockout Js:-带有删除按钮的标签绑定

111
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文