【发布时间】:2014-02-09 21:24:44
【问题描述】:
我给自己做了一个练习,以了解如何编写一个独立于 MV* 框架的可扩展 API,以便在非 DOM 环境中使用。理想的最终结果是拥有一个类库或排序,然后由 MV* 框架(如 Knockout)使用,我在下面的示例中使用它。
到目前为止,我发现的最大挑战是处理保留双向绑定。为了做到这一点,底层属性必须是可观察的。
// no DOM in here, just the basics
function QueryRequest(){
};
QueryRequest.prototype = {
get preference() {
return this._preference;
},
set preference(val) {
this._preference = val;
}
}
以下是库中函数定义的示例。
function QueryRequestViewModel() {
QueryRequest.call(this);
// DOM interaction safe in here...
this.preference = ko.observable('Pizza');
};
// inherit from QueryRequest, then point the constructor back to the view model, base we already call base.
QueryRequestViewModel.prototype = new QueryRequest();
QueryRequestViewModel.prototype.constructor = QueryRequestViewModel;
ko.applyBindings(new QueryRequestViewModel()); // bind
这里是视图模型,它不是独立的,而是继承自 QueryRequest。
<input id="user-desire" type="text" name="desire" maxlength="500" data-bind="value: preference" />
几乎一切正常,但有一个有点烦人的问题。
当敲除设置变量时,它不仅仅是设置原语,它还想设置它自己的对象。显然,这不是我们想要的结果。
我唯一的要求是knockout和任何与DOM相关的代码不能在库中。
还有其他方法可以实现我想要的吗?我对另一个 MV* 库持开放态度,该库也采用不同的方法来观察属性。
【问题讨论】:
标签: javascript node.js oop mvvm knockout.js