使用具有knockout observables的object.defineproperty

时间:2013-10-29 13:24:20

标签: object knockout.js

我可以(如果是的话)如何从这样的ko.observable中创建object.defineproperty

Strength: ko.observable(
    Object.defineProperty(this, "strength", {
        get: function () {
            return this.level * 2;
        },
        enumerable: true
    });
)

<span> str: <span data-bind="text: Strength"></span> / 100 </span>

我想要做的是在每次升级后调用strength时更新显示

  1. 升级
  2. (战斗)请求当前的力量
  3. 更新实力(+=2
  4. 更新实力显示
  5. 使用Object.defineProperty

    我可能只会使用ko.computable,但我想知道是否有办法做到这一点。

2 个答案:

答案 0 :(得分:2)

有点不清楚你想要实现什么,但我会选择ko.computed。如果您希望通知Strength属性的订阅者(即您的范围)(在初始绑定后level更改时),您还应该level可观察。

如果您仍想使用defineProperty,我希望this little example suits you(编辑:添加按钮以升级)

function ViewModel() {
    var self = this;
    self.level=ko.observable(5);
    self.really_use_computed = ko.computed(function() {
        return self.level() * 2;
    });
}

var MyViewModel=new ViewModel();

Object.defineProperty(MyViewModel, "Strength", {
    get: function () {
        return this.level() * 2;
    },
    enumerable: true
});

ko.applyBindings(MyViewModel);

请注意Object.defineProperty()的第一个参数Internet Explorer 8 standards mode supports DOM objects but not user-defined objects以及IE don't support Object.defineProperty()的早期版本。

答案 1 :(得分:1)

Knockout ES5 plugin将满足您的需求。虽然我还必须包含Weakmap shim以使其有效。