组织Knockout.JS viewmodel属性的最佳实践 - 对象文字或稍后添加?

时间:2016-06-24 01:18:19

标签: javascript mvvm knockout.js

我正在使用Knockout.JS进行代码质询。到目前为止,它非常整洁。

如果有人可以帮助我,我会就最佳做法提出一些简单的问题。我试图想象使用这个图书馆会是什么样的大规模,但这很困难。

在声明viewModel时,通常最好只在模型中声明observable声明并在以后使用效用函数吗?或者应该同时声明viewModel的整数函数吗?

所以这个:

var viewModel = {
    newItemName: ko.observable(),
    newItemPrice: ko.observable(0),
    newItemQuantity: ko.observable(1)
};

viewModel.incrementUp = function() {
    var value = this.quantity() + 1;
    this.quantity(value);
};
// more functions here

ko.applyBindings(viewModel);

对。这个:

var viewModel = {
    newItemName: ko.observable(),
    newItemPrice: ko.observable(0),
    newItemQuantity: ko.observable(1),

    addNewItem: function () {
        var newItem = {
            name: capitalizeFirst(this.newItemName()),
            price: this.newItemPrice(),
            quantity: ko.observable(this.newItemQuantity())
            };
        }
    };

viewModel.something = ko.computed(function() {
     return 'do stuff'
});

ko.applyBindings(viewModel);

或者人们通常只是在之后添加计算值?我不知道人们是否会欣赏整体的viewModel文字或者是否应该如何处理它。我已经习惯了Angular的Angular方式'做任何事,哈哈。

抱歉这么迂腐。正如我所说,这是一个代码挑战,我想留下深刻的印象......而且我发现很难找到Knockout应用程序的例子。

谢谢!

2 个答案:

答案 0 :(得分:1)

不使用任何选项,但小测试和重新编译之类的东西除外。有更好的选择。

PS。请注意,您的第二个示例甚至是错误this内的addNewItem关键字将引用视图模型!

基本问题的完整答案对Stack Overflow而言过于宽泛。基本问题是这样的:

  

如何在Javascript中使用适当的封装创建可重用的代码/ View模型?

意识到你提出了一个相当广泛的问题,并接受这样一个事实,即在你知道答案之前,你需要阅读/学习很多东西。我建议首先阅读Javascript中的prototypal(也称为“prototypical”)和经典继承,以及现代ECMA Script,Typescript等更现代的class功能。

为了给你一个具体的提示,以便更容易地创建带有计算机的视图模型,这里有一个使用“构造函数”的例子,它可以在所有现代(和一些稍微更旧)的浏览器中工作,无需额外的库或转换步骤:< / p>

function ViewModel() {
  // Keep a reference to the instance of the view
  // model, becauese "this" itself might behave in
  // unexpected ways within functions inside this
  // view model constructor function.
  var self = this;

  self.firstName = ko.observable("john");
  self.surname = ko.observable("doe");

  self.fullname = ko.computed(function() {
     return self.firstName() + " " + self.surname();
  });
}

// Use it like this:
var johndoe = new ViewModel();

它利用the self=this idiom以及构造函数(也是side-note recommendation in the KO docs)。

答案 1 :(得分:0)

这取决于具体情况。

对我来说,我喜欢保留与模型中的视图模型完全相关的任何内容,然后如果我需要为视图模型的特定用途添加特定功能,我可以稍后添加。

这意味着我可以创建一个可重复使用的模型/视图模型,并在需要时将其用于我的特定需求。