2015-10-19 98 views
3

我正在使用引导程序和角度进行聊天。每个消息都以“well-sm”类显示在其div中。 这是负责该代码的样子:角元素记录不正确的值

<div ng-repeat="message in messages" class="media" > 
    <h5 class="media-heading"><span>{{message.nick}}</span> {{message.time | date: "yyyy.MM.dd HH:mm"}}</h5> 
    <div change-well-height class="well well-sm">{{message.body}} 
    </div> 
</div> 

但是,如果它的长度是太大了,我们得到这样的: How ordinary and long messages look like

所以我决定增加一个指令变化以及高度看起来scrollWidth是否大于clientWidth,如果是,则更改高度。 代码的指令:

(function() { 
    'use strict'; 

    app.directive('changeWellHeight', [ 
    '$location', function($location) { 
     return { 
     restrict: "A", 
     link: function(scope, element, attr) { 
      $(document).ready(function(){ 
      console.log(element); 
      console.log(element['0'].scrollHeight, element['0'].clientHeight, 'Height'); 
      console.log(element['0'].scrollWidth, element['0'].clientWidth, 'Width'); 
      if (element['0'].scrollHeight > element['0'].clientHeight || element['0'].scrollWidth > element['0'].clientWidth){ 
       //do stuff 
      } 
      }); 
     } 
     }; 
    } 
    ]); 

}).call(this); 

NOW问题当我第一次看登出整个元素,我看到,很多都在Chrome和FF的属性中: clientWidth:467, scrollWidth: 2347个

但接下来的console.log显示: 435 435“宽度”

这怎么可能是同一个对象给了我不同的价值观?我不知道如何解决这个问题

+0

你在某些时候改变数值? console.log不会显示所有不同的值,只会有最后一个,至少在chrome中,它通过日志旁边控制台中的黄色三角形显示。 – koox00

+0

@ koox00,谢谢你的评论。那里没有黄色的三角形。 我不会更改该值,只需将其注销即可。可以隐式改变某处,但我没有编写任何代码来改变它。 另外,这很奇怪。我注销了元素的所有属性并且它是正确的,并且在下一行中,我只注销了两个属性 - 其中一个属性不正确。我认为没有时间去改变。 – Sapientisat

+0

'link'运行时不会呈现文本,请尝试使用'$ timeout' – charlietfl

回答

3

而不是使用document.ready这是没有价值的反正,使用$timeout所以,当你的代码运行的文本将呈现:

app.directive('changeWellHeight', [ 
    '$location', '$timeout', function($location, $timeout) { 
     return { 
     restrict: "A", 
     link: function(scope, element, attr) { 
      $timeout(function(){ 
      console.log(element); 
      console.log(element['0'].scrollHeight, element['0'].clientHeight, 'Height'); 
      console.log(element['0'].scrollWidth, element['0'].clientWidth, 'Width'); 
      if (element['0'].scrollHeight > element['0'].clientHeight || element['0'].scrollWidth > element['0'].clientWidth){ 
       //do stuff 
      } 
      }); 
     } 
     }; 
    } 
    ]); 
1

也许这个值在控制台打开元素内部的属性之前就会变得更新。我已经在Chrome上注意到了这一点,如果在控制台打开对象之前更新对象的某个属性值,然后打开该对象,即使您在更新之前对其进行了控制,也会看到该值已更新。 要测试,声明一个数组数组,控制它,更改值,然后打开该对象,您将看到更新的值。

var array = [[0]]; 
console.log(array); 
array[0][0] = 1; 

现在,要弄清楚为什么价值在变化,我们需要更多的细节。