KnockoutJS和AngularJS的讨论

文件

嵌りどころ等で英語必須。
公式の日本語訳が有志により存在する。
開発ドキュメントは一式揃っている。
Githubでの戦闘力が4900とナッパ並
公式のチュートリアルが秀逸で、その場でHTMLとJSを修正して動作させながら学習することができる。
Githubでの戦闘力が23000と3倍界王拳悟空並
公式のドキュメントが見辛いので、AngularJS Hubを参照するとよい

AngularJS 中心 Hub

原文: ソースコード

中文翻译: 源代码

function AppViewModel() {
  this.firstName = ko.observable("Bert");
  this.lastName = ko.observable("Bertington");
  this.fullName = ko.computed(function () {
    return this.firstName() + " " + this.lastName();
  }, this);
}

// Activates knockout.js
ko.applyBindings(new AppViewModel(), $("#main")[0]);
<div id="main">
  <p>First name: <input type="text" data-bind="value: firstName"/></p>
  <p>Last  name: <input type="text" data-bind="value: lastName"/></p>
  <p>Full  name: <strong data-bind="text: fullName"></strong></p>
</div>
angular.module("mainModule", [])
  .controller("myController", function ($scope) {
    $scope.firstName = "John";
    $scope.lastName = "Doe";
    $scope.getFullName = function () {
      return $scope.firstName + " " + $scope.lastName;
    }
  });
<div ng-app="mainModule">
  <div ng-controller="myController">
    <p>First name: <input type="text" ng-model="firstName"/></p>
    <p>Last  name: <input type="text" ng-model="lastName"/></p>
    <p>Full  name: <strong>{{getFullName()}}</strong></p>
  </div>
</div>

感受

在简单的代码中,写法并没有太大的变化。但是,由于Angular甚至需要使用函数来定义,所以有必要熟练掌握Angular的规范。而在Knockout中,由于没有破坏JavaScript的写法,因此可以直观地自由编写。

例如,通过执行$controller(‘ParentCtrl’, {$scope: $scope});,可以实现继承。
如果是Knockout,只需进行扩展。
这也不会破坏与CoffeeScript的兼容性。

最後的結論

可以使用喜欢的那一方

往常胡言乱语

Angular很受欢迎,但编写方式让我有些难以接受。
感觉代码杂乱无章,以后再次检查源代码时,可能会冒出大量问号标记。
虽然有依赖注入(DI),但我觉得不需要。

从现在的角度来看,使用scope来进行通知的机制是不错的。
因为knockout会变成ko.observable()和函数,所以写起来非常困难。
如果可以使用ES5,则可以使用defineProperty来进行通知,所以knockout会更好一些。

在绑定中,Knockout默认使用focusout,而Angular默认使用keypress。哪个更好尚不清楚。

Angular的路由机制感觉很丑陋。
我觉得用Sinatra的语法会更好,但是可能因为想要使用模板所以不行吧?

Angular是一个全栈框架,如果能深入一点,可能会发现更多东西,但写法不太好,使用之后无法承担责任,感到不安。

如果对Angular的语法感觉没有异样的话,我觉得用Angular也不错。

我刚刚意识到,因为在使用DI所以代码结构如此糟糕。
我希望改用没有DI的Angular。

啊,我只是輕微使用過Angular,就被批評了。對於我來說,我更喜歡Knockout。

bannerAds