0

我可以(如果可以的话)创建一个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每次升级后调用它的时间的显示

IE

  1. 升级
  2. (战斗)请求目前的实力
  3. 更新强度 ( +=2)
  4. 更新强度显示

使用Object.defineProperty

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

4

2 回答 2

2

有点不清楚你想要实现什么,但我会选择ko.computedStrength如果您希望通知属性的订阅者(即您的跨度) (level在初始绑定后发生更改时),您还应该使levelobservable。

如果你仍然想使用defineProperty,我希望这个小例子适合你(编辑:添加了一个按钮来升级)

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);

请注意,Internet Explorer 8 标准模式支持 DOM 对象,但不支持第一个参数的用户定义对象Object.defineProperty(),早期版本的 IE根本不支持Object.defineProperty()

于 2013-10-29T21:09:13.483 回答
1

Knockout ES5 插件将满足您的需求。尽管我还必须包含Weakmap shim才能使其正常工作。

于 2014-07-04T19:08:06.540 回答