【问题标题】:Separating Knockout.js, Node.js, and Standalone API but maintain two bindings and other functionalities分离 Knockout.js、Node.js 和独立 API,但维护两个绑定和其他功能
【发布时间】: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


    【解决方案1】:

    这是您想要实现的目标吗?我已将您的代码改编成 JSFiddle http://jsfiddle.net/rwisch45/6Lkv3/3/

    只是一些基本的视图模型继承。由于我将preference 设置为基础视图模型中的可观察对象,因此可以在继承该基础的视图模型中访问它。

    // no DOM in here, just the basics
    var QueryRequest = function () {
        var self = this;
        self.preference = ko.observable();
    }
    
        function QueryRequestViewModel() {
            var self = this;
            // inherit from QueryRequest, then point the constructor back to the view model, base we already call base. 
            QueryRequest.call(self);
    
            self.setPreference = function () {
                self.preference("Pizza");
            }
        };
    
    
    ko.applyBindings(new QueryRequestViewModel());
    

    您可以像这样将选项传递给基本视图模型,http://jsfiddle.net/rwisch45/6Lkv3/4/

    【讨论】:

    • 我了解您所做的,但我确实希望在 QueryRequest 的函数定义中使用 Knockout 代码。相同的代码将在非 dom 环境中。因此,只有视图模型应该包含对敲除的任何引用,但仍保留事件、绑定等的全部功能。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-20
    • 1970-01-01
    • 2020-08-19
    • 1970-01-01
    • 2021-06-07
    • 1970-01-01
    相关资源
    最近更新 更多