Knockout.js 在“选择”中加载视图,并在文本框中查看选定值

Knockout.js 在“选择”中加载视图,并在文本框中查看选定值,knockout.js,Knockout.js,我正在尝试将“角色”加载到select控件中。 select将正确填充以下内容: var user = new spatest.myrole(result.roleid, result.rolename); var user = new spatest.roleViewModel(result.roleid, result.rolename); 但不是这样: var user = new spatest.myrole(result.roleid, result.rolename); v

我正在尝试将“角色”加载到select控件中。 select将正确填充以下内容:

 var user = new spatest.myrole(result.roleid, result.rolename);
var user = new spatest.roleViewModel(result.roleid, result.rolename);
但不是这样:

 var user = new spatest.myrole(result.roleid, result.rolename);
var user = new spatest.roleViewModel(result.roleid, result.rolename);
最后,我希望在选择控件中填充每个角色的值,然后在选择每个角色时,我希望rolename和roleid显示在文本框中:

<input id="idrolename" type="text" data-bind="value: rolename" />
<input id="idroleid" type="text" data-bind="value: roleid"  />

我是击倒赛的初学者

My view.html:

<div class="dnnFormItem">
    <div><label for="itemUser">[Resx:{key:"lblAssignedUser"}]</label></div>
    <select id="rolesid" data-bind="options: roleList,
                                    optionsText: 'rolename',
                                    optionsValue: 'roleid',
                                    optionsCaption: 'Choose...'"></select>
</div>

[Resx:{key:“lblAssignedUser”}]
我的JS文件:

var spatest = spatest || {};

spatest.roleListViewModel = function (moduleId, resx) {

    var service = {
        path: "spatest",
        framework: $.ServicesFramework(moduleId)
    }
    service.baseUrl = service.framework.getServiceRoot(service.path);

    var isLoading = ko.observable(false);
    var roleList = ko.observableArray([]);


    var init = function () {
        getRoleList();
    }

    var getRoleList = function () {
        isLoading(true);

        // need to calculate a different Url for User service
        var restUrl = service.framework.getServiceRoot(service.path) + "Myroles/Roles/";
        var jqXHR = $.ajax({
            url: restUrl,
            beforeSend: service.framework.setModuleHeaders,
            dataType: "json",
            async: false
        }).done(function (data) {            
            if (data) {
                load(data);
            }
            else {
                clear();
            }
        }).always(function (data) {
            isLoading(false);
        });
    };

    var load = function (data) {      
        roleList.removeAll();
        var underlyingArray = roleList();
        for (var i = 0; i < data.length; i++) {
            var result = data[i];
            var user = new spatest.roleViewModel(result.roleid, result.rolename);
           //  var user = new spatest.myrole(result.roleid, result.rolename);
           // var user = { roleid: result.roleid, rolename: result.rolename };
            underlyingArray.push(user);
        }
        roleList.valueHasMutated();
    };

    return {
        init: init,
        load: load,
        roleList: roleList,
        isLoading: isLoading
    }
};

spatest.roleViewModel = function () {

    var roleid = ko.observable('');
    var rolename = ko.observable('');

    var load = function (data) {
        roleid(data.roleid)
        rolename(data.rolename);
    };


    return {
        roleid: roleid,
        rolename: rolename,
        load: load
    }
}


spatest.myrole = function (roleid, rolename) {
    this.roleid = roleid;
    this.rolename = rolename;
}

spatest.roleChanged = function (obj, event) {

    if (event.originalEvent) { //user changed
        alert('1');
    } else { // program changed
        alert('2');
    }

}
var spatest=spatest | |{};
spatest.roleListViewModel=函数(moduleId,resx){
var服务={
路径:“spatest”,
框架:$.ServicesFramework(moduleId)
}
service.baseUrl=service.framework.getServiceRoot(service.path);
var isLoading=可观察的ko(假);
变量roleList=ko.observearray([]);
var init=函数(){
getRoleList();
}
var getRoleList=函数(){
孤岛加载(真);
//需要为用户服务计算不同的Url
var restUrl=service.framework.getServiceRoot(service.path)+“Myroles/Roles/”;
var jqXHR=$.ajax({
url:restUrl,
发送前:service.framework.setModuleHeaders,
数据类型:“json”,
异步:false
}).done(函数(数据){
如果(数据){
加载(数据);
}
否则{
清除();
}
}).始终(功能(数据){
孤岛加载(假);
});
};
var load=函数(数据){
roleList.removeAll();
var underyingarray=roleList();
对于(变量i=0;i
您的
roleViewModel
设置了一个内部
load
函数来执行分配,因此

var user = new spatest.roleViewModel(result.roleid, result.rolename);
你需要做什么

user.load(result);

如果我这样做,那么我会得到“uncaughttypeerror:无法读取未定义的属性'roleid'”这里是:roleid(data.roleid)对,您必须传入
数据
。使其成为
user.load(结果)
。但是您可能应该只使用传递给rolemodel的值(当前被忽略)。最后一件事是,当选择一个选项时,如何在文本框上显示rolename和roleid?感谢您的时间,我不知道输入绑定到哪个viewmodel。您的
仅使用
roleid
作为其值,因此您将丢失
rolename
。取消设置
选项值
,添加一个
绑定,以便在选中时设置某些内容,然后在输入的
绑定中引用该内容。模型应为“roleViewModel”。我相信select中的每个项目现在都是一个模型?对不起,这是我第一次和knockout互动