2014-02-24 84 views
0

我是新來的knockout.js,但得到它的速度。我真的很沮喪的一件事是如果我做JSON.stringify(koModel);我得到空對象{}如何挖空隱藏對象屬性

我知道我需要使用ko.toJSON(koModel);我得到我所需要的,但現在我很感興趣:

如何淘汰賽隱藏所有的屬性,以便JSON.stringify()不一一列舉?

UPDATE

按@dandavis評論我已經測試過,是的 - JSON.stringify()不顯示的功能都使我的模特們充滿了ko.observable()ko.observableArray()我得到一個空對象。

+1

你可以做到這一點與.prototype,Object.defineProperty (),或者使用函數作爲子對象。 – dandavis

+0

@dandavis感謝'defineProperty'!我真的不知道函數沒有顯示在'JSON.stringify()' –

+1

Knockout並不試圖「隱藏」任何東西,它只是'observable'函數使用的副作用。 – haim770

回答

2

我還沒有實際使用的淘汰賽,但一個相當不錯的猜測是,該模型的屬性是否訪問函數委託給被包裝的對象(和做更多的東西,像改變通知)。下面是一些代碼,具有相同的行爲:

var obj = { a: 1, b : 2 }; 

var ko = Object.create(null, { 
    _obj : { value : obj, enumerable: false }, 

    a : { 
    get : function() { return this._obj.a }, 
    set : function(v) { this._obj.a = v; console.log('Dispatch change event!') } 
    }, 

    b : { 
    get : function() { return this._obj.b }, 
    set : function(v) { this._obj.b = v; console.log('Dispatch change event!') } 
    } 
}); 

ko.b = 3; 
console.log(ko.a, ko.b); 
console.log(JSON.stringify(ko)); 

是的,JSON.stringify沒有考慮到功能(按JSON spec)和非枚舉的屬性。兩者都可以在上面的例子中看到。

按haim770的評論,它更直截了當,因爲屬性本​​身的功能,這是簡單地通過JSON.stringify方法忽略:

var ko = { 
    a : function(v) { 
    if (!arguments.length) return obj.a; 
    else { obj.a = v; console.log('Dispatch change event!') } 
    }, 
    b : function(v) { 
    if (!arguments.length) return obj.b; 
    else { obj.b = v; console.log('Dispatch change event!') } 
    }, 
} 
+0

+1但是Knockout不會像你提出的那樣使用getter和setter。實際使用的是getter的'someProp()'和setter的'someProp(newValue)'。 – haim770

+0

@ haim770感謝您的糾正。 – Tibos