回答

3

我確定你的意思是使用可觀察的而不是計算的,因爲這不依賴於其他的可觀測量。

我創建了a gist, including tests,創建具有可觀察屬性的模型,以及一些創建它們的實用函數。核心代碼在這裏:

var defineProperty = function(type, obj, prop, def) { 
    if (obj == null || typeof obj != 'object' || typeof prop != 'string') { 
    throw new Error('invalid arguments passed'); 
    } 

    if (Object.prototype.toString.call(def) === '[object Array]' && type === 'observable') { 
    type = 'observableArray'; 
    } 

    var obv = ko[type](def); 
    Object.defineProperty(obj, prop, { 
    set: function(value) { obv(value) }, 
    get: function() { return obv() }, 
    enumerable: true, 
    configurable: true 
    }); 

    Object.defineProperty(obj, '_' + prop, { 
    get: function() { return obv }, 
    enumerable: false 
    }); 
}; 

ko.utils.defineObservableProperty = defineProperty.bind(null, 'observable'); 
ko.utils.defineComputedProperty = defineProperty.bind(null, 'computed'); 

ko.observableModel = function(defaults) { 
    for (var prop in defaults) { 
    if (defaults.hasOwnProperty(prop)) { 
     if (defaults[prop] != null && typeof defaults[prop] == 'object' && Object.prototype.toString.call(defaults[prop]) !== '[object Array]') { 
     // should this also be an observable property? 
     this[prop] = new ko.observableModel(defaults[prop]); 
     } else if (!defaults[prop] || !ko.isSubscribable(defaults[prop])) { 
     ko.utils.defineObservableProperty(this, prop, defaults[prop]); 
     } else { 
     this[prop] = defaults[prop]; 
     } 
    } 
    } 
}; 
+0

非常好的例子! 不是我想到的,但它幫助了很多。 我的目標是真正連接到獲取/設置視圖,我做了一個項目在github上繼續,或者增量ko.mapping:[project](https://github.com/barroso/ko_get_set_es5) 謝謝。 –

+0

僅供參考...因爲observable是一個函數,所以你不需要爲它設置一個包裝器...你可以直接鏈接它(即get:obs,set:obs),這意味着你可以設置/讀取您的可觀察值而不需要括號... –