AngularJS和CoffeeScript问题

时间:2014-02-03 20:52:41

标签: angularjs coffeescript

所以我是AngularJS和CoffeeScript的新手。我正在尝试一些简单的例子,而我想要做的就是显示所选复选框的数量

,这是Javascript for that

$scope.$watch('results', function(results){
$scope.count = 0;
angular.forEach(results, function(result){
  if(result.selected){
    $scope.count += 1;
  }
})
}, true);

这完全没问题。现在我正在尝试在coffeescript中做同样的事情,这就是我所拥有的

$scope.$watch 'results', (results) ->
  $scope.count = 0;
  ( $scope.count += 1 if result.selected ) for result in $scope.results

上述coffeescript中没有编译错误,但在选中或取消选中复选框时没有任何反应。

有什么想法吗?

3 个答案:

答案 0 :(得分:0)

这是已编译的coffeescript:

$scope.$watch('results', function(results) {
  var result, _i, _len, _ref, _results;
  $scope.count = 0;
  _ref = $scope.results;
  _results = [];
  for (_i = 0, _len = _ref.length; _i < _len; _i++) {
    result = _ref[_i];
    _results.push(result.selected ? $scope.count += 1 : void 0);
  }
  return _results;
});

这与上面的JavaScript示例功能不同。

答案 1 :(得分:0)

您可以转到js2coffee将javascript转换为coffeescript,反之亦然 这是结果,我认为它应该做你想做的事情:

$scope.$watch "results", ((results) ->
  $scope.count = 0
  angular.forEach results, (result) ->
    $scope.count += 1  if result.selected
), true

答案 2 :(得分:0)

您使用for in语法是正确的,但您忘记了第三个参数:

$scope.$watch 'results', (results) ->
  $scope.count = 0;
  ( $scope.count += 1 if result.selected ) for result in $scope.results
, true

看看我如何传递给$watch第三个参数true。它深入检查了集合值,而不仅仅是检查引用相等性。


如果你只需要浅表,你应该使用$ watchCollection(angular&gt; = 1.2):

$scope.$watchCollection 'results', (results) ->
  $scope.count = 0;
  ( $scope.count += 1 if result.selected ) for result in $scope.results

这一个100%完全编译到您提供的javascript片段:

$scope.$watch "results", (results) ->
  $scope.count = 0
  angular.forEach results, (result) ->
    $scope.count += 1  if result.selected
    return
  return
, true

如果我不需要返回任何内容,我会明确使用return 检查一下:Is there any way to not return something using CoffeeScript?