Knockout.js使每个嵌套对象成为Observable [英] Knockout.js Make every nested object an Observable

查看:257
本文介绍了Knockout.js使每个嵌套对象成为Observable的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用Knockout.js作为MVVM库将我的数据绑定到某些页面。我目前正在构建一个库来对Web服务进行REST调用。
我的RESTful Web服务返回一个简单的结构:

I am using Knockout.js as a MVVM library to bind my data to some pages. I'm currently building a library to make REST calls to a web service. My RESTful web service returns a simple structure:

{
    id : 1,
    details: {
        name: "Johnny",
        surname: "Boy"
    }
}

我有一个可观察的主要父母, myObject
当我这样做时

I have an observable main parent, myObject. When I do

myObject(ko.mapping.fromJS(data))

myObject 中的observable是:

the observables in myObject are:


  • id

  • name

  • 姓氏

  • id
  • name
  • surname

如何我可以使详细信息(理论上结构中的任何对象都是可观察的)?我需要这种行为,以便我可以在细节上设置一个计算的observable,并在任何内部数据发生变化时立即注意到。

How can I make details (and theoretically any object in the structure an observable)? I need this behavior so that i can set a computed observable on details and get noticed as soon as any of the internal data changes.

我已经建立了一个基本的递归函数应该做的伎俩。当然,它不会 myObject.details 不会成为可观察的。

I have set up a basic recursive function which should do the trick. It doesn't, of course, myObject.details doesn't become an observable.

// Makes every object in the tree an observable.
var makeAllObservables = function () {
    makeChildrenObservables(myObject);
};
var makeChildrenObservables = function (object) {
    // Make the parent an observable if it's not already
    if (!ko.isObservable(object)) {
        if ($.isArray(object))
            object = ko.observableArray(object);
        else
            object = ko.observable(object);
    }
    // Loop through its children
    for (var child in object()) {
        makeChildrenObservables(object()[child]);
    }
};

我很确定这是关于错误引用的问题,但我该如何解决这个问题呢?谢谢。

I'm pretty sure it's something about incorrect references, but how can I solve this? Thank you.

推荐答案

我认为淘汰赛没有内置的方法来观察子元素的变化。如果我理解了您的问题,当有人更改名称时,您需要将细节更改为要注意的实体。你能给出一个如何使用它的具体例子吗?你会使用对可观察细节的订阅来执行某些操作吗?

I don't think knockout has a built-in way to observe changes to child elements. If I understand your question, when someone changes the name you want a change to details as an entity to be noticed. Can you give a concrete example of how you would use this? Would you use a subscription to the details observable to perform some action?

你的代码没有使细节成为可观察的原因是因为javascript是按值传递的,所以改变函数中'object'参数的值不会改变你传递的实际值,只会改变你函数中参数的值。

The reason your code doesn't make details an observable is because javascript is pass by value, so changing the value of the 'object' argument in your function doesn't change the actual value you passed, only the value of the argument inside your function.

编辑

如果更改自动传播给父母,这应该让所有孩子都能观察到我认为,但是你通过的根第一次应该已经是一个可观察的。

If changes will automatically propagate to the parents, this should make all children observable I think, but your root that you pass the first time should already be an observable.

// object should already be observable
var makeChildrenObservables = function (object) {
    if(!ko.isObservable(object)) return;

    // Loop through its children
    for (var child in object()) {
        if (!ko.isObservable(object()[child])) {
            object()[child] = ko.observable(object()[child]);
        }
        makeChildrenObservables(object()[child]);
    }
};

这篇关于Knockout.js使每个嵌套对象成为Observable的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆