Knockout.js 敲除-需要使用数组的对象更新视图

Knockout.js 敲除-需要使用数组的对象更新视图,knockout.js,Knockout.js,我有一个对象数组,其中每个对象定义了我要显示的特定模态的元素。 就是这样 var data = [{view1:"hello", view2:"world"}]; var viewModel = { currentView: ko.observable({}) // are objects observable? }; 然后,当我加载模态时,我将对象从数组中取出 var getDataForView = function (id) { var result =

我有一个对象数组,其中每个对象定义了我要显示的特定模态的元素。 就是这样

var data = [{view1:"hello", view2:"world"}];

var viewModel = {
     currentView: ko.observable({})   // are objects observable?
};
然后,当我加载模态时,我将对象从数组中取出

var getDataForView = function (id) {
        var result = data.filter(function (obj) {
            return obj.Id == id;
        });
        return result;
    };
然后将该对象作为当前视图加载

var singleViewData = getDataForView(id);
viewModel.currentView(singleViewData);

对象似乎没有更新?当我呼吁不同的观点。我在这里做错了什么,正确的方法是什么?

getDataForView
返回一个数组。此外,您提供的测试数据不包含任何具有
Id
属性的对象

如果您解决了这些问题,一切都会正常工作:

var数据=[{
视图1:“你好”,
身份证号码:0
}, {
视图2:“世界”,
身份证号码:1
}];
var viewModel={
currentView:ko.observable({})//对象是可观察的吗?
};
var getDataForView=函数(id){
var结果=数据过滤器(函数(obj){
返回obj.Id==Id;
});
返回结果;
};
应用绑定(视图模型);
var singleViewData=getDataForView(0)[0];
viewModel.currentView(singleViewData)

getDataForView
返回一个数组。此外,您提供的测试数据不包含任何具有
Id
属性的对象

如果您解决了这些问题,一切都会正常工作:

var数据=[{
视图1:“你好”,
身份证号码:0
}, {
视图2:“世界”,
身份证号码:1
}];
var viewModel={
currentView:ko.observable({})//对象是可观察的吗?
};
var getDataForView=函数(id){
var结果=数据过滤器(函数(obj){
返回obj.Id==Id;
});
返回结果;
};
应用绑定(视图模型);
var singleViewData=getDataForView(0)[0];
viewModel.currentView(singleViewData)

我会使用计算出的

var data = [{view1:"hello", view2:"world"}];

var viewModel = {
    views      : ko.observable( data ),
    currentId : ko.observable('view1')
};
viewModel.currentView = ko.computed( function(){
    var cid = viewModel.currentId();
    var views = viewModel.views();
    if( views.hasOwnProperty( cid ) ){
       return views[cid];
    } else {
       return "";
    }
} );
我会使用计算机

var data = [{view1:"hello", view2:"world"}];

var viewModel = {
    views      : ko.observable( data ),
    currentId : ko.observable('view1')
};
viewModel.currentView = ko.computed( function(){
    var cid = viewModel.currentId();
    var views = viewModel.views();
    if( views.hasOwnProperty( cid ) ){
       return views[cid];
    } else {
       return "";
    }
} );

我相信你的问题是为什么你的观点没有更新其中的价值观。这是因为
currentView
是可观察的,但其中包含的数据是不可观察的。如果要更新“hello”和“world”值,则它们也必须是可见的。我相信你的例子有点做作,你的数据中确实有id,但你的问题的答案是:

  • 如果您想要更新一个值,那么它需要是一个可观察的值,否则它将不会被更新。这意味着单个属性,而不仅仅是它们所属的对象
var data=[{id:123,view:ko.observable(“hello”)},
{id:456,视图:ko.observable(“世界”)};
var ViewModel=函数(){
var self=这个;
self.currentView=ko.observable()//任何东西都可以被观察到
};
var getDataForView=函数(id){
var结果=数据过滤器(函数(obj){
返回obj.id==id;
});
如果(result.length==0)
回来
返回结果[0]。视图();
};
var vm=new ViewModel();
vm.currentView(getDataForView(456));
ko.应用绑定(vm)




当前视图:
我认为您的问题是为什么您的视图没有更新其中的值。这是因为
currentView
是可观察的,但其中包含的数据是不可观察的。如果要更新“hello”和“world”值,则它们也必须是可见的。我相信你的例子有点做作,你的数据中确实有id,但你的问题的答案是:

  • 如果您想要更新一个值,那么它需要是一个可观察的值,否则它将不会被更新。这意味着单个属性,而不仅仅是它们所属的对象
var data=[{id:123,view:ko.observable(“hello”)},
{id:456,视图:ko.observable(“世界”)};
var ViewModel=函数(){
var self=这个;
self.currentView=ko.observable()//任何东西都可以被观察到
};
var getDataForView=函数(id){
var结果=数据过滤器(函数(obj){
返回obj.id==id;
});
如果(result.length==0)
回来
返回结果[0]。视图();
};
var vm=new ViewModel();
vm.currentView(getDataForView(456));
ko.应用绑定(vm)




当前视图:
感谢您的回复,这很有帮助,我能够获得要显示的数据。他们仍然是一个不适合我的部分,但是,我需要写一个单独的帖子。很高兴听到你(大部分)明白了。我试图提出一个“修复”方案,尽可能接近您的初始代码。您可能还想查看其他答案以获得其他方法。感谢您的回复,这很有帮助,我能够显示数据。他们仍然是一个不适合我的部分,但是,我需要写一个单独的帖子。很高兴听到你(大部分)明白了。我试图提出一个“修复”方案,尽可能接近您的初始代码。您可能还想查看其他答案,以找到替代方法。