为什么不评论这项工作?thinkster.io,angularjs教程,平均值,递增投票()

为什么不评论这项工作?thinkster.io,angularjs教程,平均值,递增投票(),angularjs,angular-ui-router,Angularjs,Angular Ui Router,我在这里学习thinkster angular js教程: 点击评论旁边的upvotes图标无法增加upvote计数 在index.html内联包含的ui路由器模板中,ng单击调用addUpvote,但addUpvote由另一个状态中指定的控制器定义。因此,模板调用addUpvote的唯一方法是模板的关联状态/控制器以某种方式从另一个状态/控制器继承。事实上,根据这里的ui路由器文档: 在my app.js中定义状态的方式 app.js: app.config([ '$stateProvider

我在这里学习thinkster angular js教程:

点击评论旁边的upvotes图标无法增加upvote计数

在index.html内联包含的ui路由器模板中,ng单击调用addUpvote,但addUpvote由另一个状态中指定的控制器定义。因此,模板调用addUpvote的唯一方法是模板的关联状态/控制器以某种方式从另一个状态/控制器继承。事实上,根据这里的ui路由器文档:

在my app.js中定义状态的方式

app.js:

app.config([
'$stateProvider', 
'$urlRouterProvider', 
function($stateProvider, $urlRouterProvider) {
  $urlRouterProvider.otherwise('home');

  $stateProvider
    .state('home', { 
      url: '/home',
      templateUrl: '/home.html',
      controller: 'MainCtrl' }
    )
    .state('posts', {  
      url: '/posts/{id}',
      templateUrl: '/posts.html',
      controller: 'PostsCtrl' }
    );

}]);
…第二种状态继承自第一种状态编辑:更仔细地阅读文档让我相信这不是真的;我认为为了让posts状态从home状态继承,我必须将posts状态的名称更改为home.posts。然而,当我尝试这样做时,它破坏了其他东西:帖子旁边的评论链接不再起作用。无论如何,我不认为写:

$stateProvider
  .state(...)
  .state(...);
在两个状态之间创建任何继承

这是第一个州的控制器:

app.controller('MainCtrl', ['$scope', 'posts', function($scope, posts) {
  $scope.posts = posts.posts;
  /*
  [
    {title: "post1", upvotes: 3, link: ''},
    {title: "post2", upvotes: 5, link: ''},
    {title: "post3", upvotes: 1, link: ''}
  ];
*/
  $scope.addPost = function() {
    var title = $scope.title;

    if (title && (title.trim().length > 0) ) {
      $scope.posts.push({
        title: title, 
        upvotes: 0, 
        link: $scope.link,
        comments: [
          {author: 'Joe', body: 'Cool post!', upvotes: 0},
          {author: 'Bob', body: 'Great idea, but everything is wrong!', upvotes: 0}
        ]
      });
    }

    $scope.title = '';
    $scope.link = '';
  }

  //*****HERE IS THE FUNCTION THAT IS NOT BEING CALLED*****
  $scope.addUpvote = function(post) {
    console.log("in addUpvote");
    ++post.upvotes;
  }

}]);
据我所知,我的模板应该能够调用addUpvote。但是,当我单击注释旁边的upvote图标时,console.log行不会输出任何内容,因此显然没有调用addUpvote

以下是index.html的一部分:

<body ng-app="flapperNews">

  <div class="row">
    <div class="col-md-6 col-md-offset-3">
      <ui-view></ui-view>
    </div>
  </div>
....
....
....
<script type="text/ng-template" id="/posts.html">
  <div class="page-header">
    <h3>
      <a ng-show="post.link" href="{{post.link}}">
        {{post.title}}
      </a>
      <span ng-hide="post.link">
        {{post.title}}
      </span>
    </h3>
  </div>

  <div ng-repeat="comment in post.comments | orderBy:'-upvotes'">
    <span class="glyphicon glyphicon-thumbs-up"
          ng-click="addUpvote(comment)"></span>

    {{comment.upvotes}} - by {{comment.author}}

    <span style="font-size:20px; margin-left:10px;">
      {{comment.body}}
    </span>
  </div>
</script>
</body>

在该模板的底部,ng click calls addUpvote。为什么不调用addUpvote。

文档中的解释更进一步:

仅按视图层次结构进行范围继承

请记住,作用域属性只继承状态链 如果州的视图是嵌套的。范围继承 属性与状态和属性的嵌套无关 与视图模板嵌套有关的所有内容

您完全有可能拥有其模板的嵌套状态 在站点中的各种非嵌套位置填充ui视图。在里面 在这种情况下,您不能期望访问的范围变量 子状态视图中的父状态视图

以及:

子状态从父状态继承什么

子州从父州继承以下内容:

通过resolve解决依赖关系 自定义数据属性 没有继承任何其他内容—没有控制器、模板、url等。 ... ... 子状态将从父状态继承数据属性,而父状态 它们可以覆盖

为了让评论有效,我做了以下几点:

app.controller('PostsCtrl', [
'$scope', 
'$stateParams', 
'posts',
function($scope, $stateParams, posts) {
  $scope.post = posts.posts[$stateParams.id];

  $scope.addUpvote = function(comment) {
    console.log('comment upvote');
    ++comment.upvotes;
  }

}]);

我也有同样的错误,当我在cURL中运行url时,它返回req.comment.upvote不是错误堆栈顶部的函数

C:\Users\ddavis>curl-X PUT req.comment.upvote不是一个函数

在我的例子中,当我在comments.js模型中定义一个upvote函数时,它起了作用,如下所示:

var mongoose=需要“mongoose”; var CommentSchema=newmongoose.Schema{ 正文:字符串, 作者:String, UPVOUTES:{type:Number,默认值:0}, posts:[{type:mongoose.Schema.Types.ObjectId,ref:'Post'}] }; CommentSchema.methods.upvote=functioncb{ 该值为+1; 这是savecb; }; 模型“注释”,注释模式;
app.controller('PostsCtrl', [
'$scope', 
'$stateParams', 
'posts',
function($scope, $stateParams, posts) {
  $scope.post = posts.posts[$stateParams.id];

  $scope.addUpvote = function(comment) {
    console.log('comment upvote');
    ++comment.upvotes;
  }

}]);