【问题标题】:angular masonry directive with serverside data带有服务器端数据的角度砌体指令
【发布时间】:2014-12-11 01:07:25
【问题描述】:

我将如何应用带有 angular 指令的砌体网格,其中元素是在服务器端创建的,而 angular 通过 ajax 获取它。当它加载时应该检查指令而不是简单地应用砖石jQuery

来自砌体示例

var container = document.querySelector('#container');
var msnry = new Masonry( container, {
  // options...
  itemSelector: '.item',
  columnWidth: 200
});

我的尝试

angular.module('myApp')
  .directive('masonry', function($parse) {
      return{
        restrict: "E",       
        compile: function (element, attrs) {

                element.masonry({
                    itemSelector: '.masonry-brick',
                    columnWidth: 70
                });


        }
      } 
    });

服务器端生成的标记

<masonry>
  <div class="masonry-brick">
     <a href="#"><img src="/path/to/image" /></a>
  </div>
</masonry>

关键是我的 masonry 指令标记是由另一个指令生成的,它看起来跟在后面

angular.module('myApp')
  .controller('SlugCtrl', function ($scope, WpApi, $compile, $filter, ngProgressLite, $timeout) {

    // the Content to be rendered.
   $scope.maincontent = [];
   //loading animate starts
   ngProgressLite.start();
   loadRemoteData();



   // load remote data from the server.
   function loadRemoteData() {
   // The WpApiService returns a promise.
        WpApi.getContents()
        .then(
            function( post ) {       
                applyRemoteData( post );       
            });    
    }

     // apply the remote data to the local scope.
    function applyRemoteData( newContents ) {   

        $scope.maincontent  = $compile( newContents[0].content )($scope);  

        //$scope.maincontent  = $compile( newContents[0].content )($scope);  
        //console.log($scope.maincontent); 

    }

  //loading animate ends
  ngProgressLite.done();        

}).directive('maincontent', function() {

    return {
            restrict: 'A',
                scope: {
                    maincontent: '=maincontent'
                },

                link: function (scope, element, attrs) {                 
                  scope.$watch('maincontent', function(val) {
                        if(!val) { return; }
                        element.append( val  );                                      
                    });                              
                  }
                };
})

然后我在第二个指令上尝试了以下指令,该指令在砌体上触发,但它们不会以 popper 方式呈现并且在调整大小屏幕上会跳过

angular.module('myApp')
  .directive('masonry', function($parse) {
      return{
        restrict: "E",       
        compile: function (element, attrs) {
            var selector = element.parent('.gallery');

            if(selector){
                selector.masonry({
                    itemSelector: '.masonry-brick',
                    columnWidth: 70
                });
                console.log(selector);
            } else {
                alert();
            }

        }
      } 
    });

问题似乎与父容器上的错误计算有关

检查我得到的 dom style="position: relative; height: 22233px;" 高度很大

【问题讨论】:

  • 第二个代码块不工作吗?错误是什么?
  • 第二个代码块在砌体上触发,它们将显示的图像如上传的示例所示。在屏幕上调整大小指令不再起作用

标签: jquery angularjs angularjs-directive


【解决方案1】:

applyRemoteData 中的$compile 下方添加$scope.$digest()

function applyRemoteData( newContents ) {   

    $scope.maincontent  = $compile( newContents[0].content )($scope);  
    $scope.$digest()
    //$scope.maincontent  = $compile( newContents[0].content )($scope);  
    //console.log($scope.maincontent); 

}

【讨论】:

  • 感谢您的反馈。建议产生数字错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多