2013-09-12 4 views
4

Я пытаюсь дать мой динамический стиль div - я хочу, чтобы css пришел с контроллера, где объект css, который возвращает контроллер, не жестко закодирован, а динамически изменяется (мне нужен «верхний», поле, которое является переменной). Я использую нг стиль, чтобы попытаться достичь этого:Angular ngStyle Variable Style

-html- 
<div id="preview" ng-style="setTopPosition()"> 

-controller- 
    $scope.setTopPosition = function() { 
    console.log("top position: " + $scope.topPosition); 
    var retObj = { top : $scope.topPosition , background: "green" }; 
    console.log(retObj); 
    return retObj 
}; 

Теперь я знаю, что значения я ожидал ($ scope.topPosition и т.д.) есть (они показывают в журнале консоли), и я знаю, контроллер запускает его код, так как фон div становится зеленым. Однако верхняя позиция не работает. Не можете ли ng-стиль использовать объекты с переменными полями? Кроме того, нужно ли это настраивать вместо этого?

+0

Как все говорили, что вам нужно, чтобы убедиться, что у вас есть " px 'добавлено к значению, однако моя проблема на самом деле заключалась в том, что $ scope.topPosition вычислялось как несинхронно. В таком случае вам нужно добавить $ scope. $ Apply –

+0

Ну, вам нужно иметь 'px', если вы не используете jQuery .... – iConnor

ответ

3

Удалить фигурные скобки от ng-style="setTopPosition(), если вы хотите использовать его как переменную.

Это должно быть ng-style="setTopPosition

в контроллере, как пример:

$scope.setTopPosition= { 
      top : $scope.topPosition+'px', 
      background : "green", 
      "width": 0 + '%', 
      "height": 5 + 'px' 
     }; 

на любое изменение вы только что установили новые значения $scope.setTopPosition= {/* ... */}

+0

Кстати есть привязка между представлением и $ scope.topPosition? Он определяется асинхронно в моем контроллере, может быть, проблема там ... –

+0

независимо от того, где вы добавляете новые значения в '$ scope.setTopPosition'. Даже в асинхронных задачах. Он должен работать –

+1

@MaximShoustin, если это асинхронно, вам нужно будет использовать '$ scope. $ Apply();' – iConnor

2

Если вы не используете JQuery с угловой вы должны предоставить px часть значения. jQlite не поддерживает расширенный CSS-материал, такой как jQuery, поэтому вы должны это сделать.

top : $scope.topPosition + 'px' 

Примечание: Причина, почему я говорю, что это потому, что стили применяются обычно в ng-style директивы, как это: element.css(styles);

4

В случае, если кто-то приходит через этот вопрос, как я сделал, проблема для меня пришло после обновления от Angular 1.2.x до Angular 1.3.x.

После обновления, он на самом деле не удалось, когда я вручную добавил 'px':

<span ng-style="{top: spanTop + 'px'}">I (don't) have top!</span> 

и он начал работать, когда я удалил 'px':

<span ng-style="{top: spanTop}">I have top!</span> 
Смежные вопросы