AngularJS:为什么数据不在视图中显示我可以使用$ scope.apply?

时间:2015-06-10 03:15:47

标签: angularjs angularjs-directive angularjs-scope angularjs-ng-repeat

我从服务中获取数据并使用 ng-repeat 在视图中显示。实际上,当用户滚动到底部意味着当用户到达底部我会做某事时我得到事件。当它到达时我正在改变我的数组的竞争。我在ng-repeat数组(显示数组)中获得了正确的竞争,但它没有反映在视图上为什么?我可以使用 $ scope.apply()或$ scope.digest()

这是我的代码

well-known item metadata

在这里,我正在改变我的显示数组的竞争,这不会反映在视图

  def send_photo_attachment
    @tempfile = Tempfile.new
    @tempfile.binmode
    @tempfile.write request.body.read
    @tempfile.rewind

    uploaded_file = ActionDispatch::Http::UploadedFile.new(
          tempfile: @tempfile,
          filename: "photo.jpg"
        )
    uploaded_file.content_type = "image/jpeg"
    @message_content = MessageContent.new
    @message_content.content = uploaded_file
    @message_content.mimetype = "image/jpeg"
    render :attachment_id
  end

2 个答案:

答案 0 :(得分:1)

正如@Claies所提到的,你应该使用apply()。虽然digest()可能也有效.apply()在内部调用digest()。他还提到,每次滚动时,似乎存储页码的变量都会重置为0。您应该将其存储在该处理程序之外的范围变量中。 我尝试用最小的改变来修复

http://plnkr.co/edit/izV3Dd7raviCt4j7C8wu?p=preview

 .directive("scrollable", function() {
    return function(scope, element, attrs) {
      var container = angular.element(element);
      container.bind("scroll", function(evt) {
        console.log('scroll called'+container[0].scrollTop);
        var counter = scope.page;
        if (container[0].scrollTop <= 0) {
          if (scope.var > 0)
            scope.display = scope.arrays[--scope.var].concat(scope.arrays[scope.var+1]);

        }

        if (container[0].offsetHeight + container[0].scrollTop >= container[0].scrollHeight) {

          if (scope.var < scope.arrays.length)
            scope.display = [];
          var nextvar = ++counter;
          var increment = counter + 1
          console.log("nextvar:" + nextvar + "increment:" + increment)
          scope.display = scope.arrays[nextvar].concat(scope.arrays[increment]);
          console.log(scope.display)
          scope.page = counter;
        }
        scope.$apply();
      });
    };
  })

通常我会以不同的方式实现这一点。例如,通过在列表底部放置一个旋转轮,当显示时,您将获得其余数据。 很难给你一个完整的工作的plunker。可能你应该在plunker中有多个JSON文件,每个文件包含一个页面的数据,这样我们就可以将数据添加到显示列表的底部。

答案 1 :(得分:0)

修改display数组后,您只需调用scope.$apply()即可运行$digest周期并更新视图。您还需要在控制器或指令中初始化scope.var并有条件地修改它。

如果这是你想要的,我不会。我修改过的plunker看看。 http://plnkr.co/edit/J89VDMQGIXvFnK86JUxx?p=preview