2015-09-18 1 views
0

Howdie сделать,Как передать переменную в области видимости контроллера для angular.element при добавлении дочернего элемента в элементе головки

Итак, мы следующий контроллер:

'use strict'; 

angular.module('24SevenWse') 
    .controller('NavbarCtrl', ['$scope', 'dataFactory', function ($scope, dataFactory) { 
     $scope.user = dataFactory.getUser(); 
     $scope.code = dataFactory.getCode(); 
     } 
     var companyLink = angular.element('<link rel="stylesheet" href="http://localhost/~jw1050/css/$scope.code.css">'); 
     angular.element('head').append(companyLink); 


    }]); 

Как вы можете видеть, я добавление новую таблицу стилей на элемент головы на странице. Теперь, когда я жестко закодировать значение, например:

var companyLink = angular.element('<link rel="stylesheet" href="http://localhost/~jw1050/css/ABC.css">'); 

Однако, я пытаюсь загрузить новое изображение с помощью CSS на основе кода пользователь входит в программное обеспечение с.

Теперь вид, что это для ниже:

<nav class="navbar navbar-fixed-top" ng-controller="NavbarCtrl"> 
    <div class="container-fluid"> 
     <div class="navbar-header pull-left"> 
      <a class="navbar-brand tracking-navbar-brand newImage"> 
       <img id="custLogo"> 
      </a> 
     </div> 
     </div> 
</nav> 

.css файл, который впрыскивается в голову только содержит следующие:

#custLogo { 
    content: url("http://localhost/~jw1050/logos/logo.png"); 
} 

The .css файлы будут каждый из них будет называться после кода, с которым пользователь может войти. Например, пользователь входит в систему с кодом ABC. Этот код будет соответствовать непосредственно к файлу ABC.css

Так что мне нужно передать код с помощью контроллера в вар companyLink так, что таблица стилей, которая прилагается к главе документа будет:

<link rel="stylesheet" href="http://localhost/~jw1050/css/ABC.css"> 

Теперь я попытался следующие в контроллере:

var companyLink = angular.element('<link rel="stylesheet" href="http://localhost/~jw1050/css/{{code}}.css">'); 
var companyLink = angular.element('<link rel="stylesheet" href="http://localhost/~jw1050/css/'{{code}}'.css">'); 

Ни похоже на работу. Мое мышление - это ссылка, которую я добавляю в голову, является частью представления. Поэтому он должен иметь возможность передавать код в контроллере для просмотра, но это, похоже, не работает.

Любые идеи?

+0

Почему бы просто не использовать встроенные стили, если у css, который вы загружаете, есть одно объявление? –

+0

Поскольку мы используем способность CSS не работать с другими листами. Так что, если код не имеет соответствующего кода, он не будет работать по умолчанию – Jimmy

+0

Вы все равно можете сделать то же самое, используя ng-attr для встроенного стиля –

ответ

1

Попробуйте это:

var companyLink = angular.element('<link rel="stylesheet" href="http://localhost/~jw1050/css/'+$scope.code+'.css">'); 
+0

Хотя этот код может ответить на вопрос, предоставляя дополнительный контекст относительно того, почему и/или как этот код отвечает на вопрос, улучшает его долгосрочную ценность. – ryanyuyu

+0

Спасибо ОЧЕНЬ много @ryanyuyu. Я даже не думал о конкатенации переменной в строку. THANK UUU !! – Jimmy

+0

Собственно, речь идет о синтаксисе ... не так много комментировать эту тему. – Marik

1

Как правило, вы хотите, чтобы избежать ввода манипуляции DOM в контроллерах, но я просто хочу, чтобы пропустить эту лекцию и идти с ответом.

Я предполагаю, что $ scope.code.css имеет строковое значение ABC, например.

Вы передаете строку в angular.element, поэтому просто создайте строку, используя оператор +.

var yourString = '<link rel="stylesheet" href="http://localhost/~jw1050/css/' + 
       $scope.code.css + '">'; 

angular.element(yourString); 

Я не тестировал это, но насколько я могу сказать, это должно работать. Вам даже не нужно создавать переменную, которую вы можете просто встроить в круглую скобку вызова angular.element (хотя, я думаю, это становится трудно читать быстро).

Если единственная цель этого кода - просто изменить логотип, я думаю, что есть лучшие способы сделать это. Использование директивы и прохождение в URL-адресе к ней - неплохая идея (см. Что-то подобное здесь angularjs: ng-src equivalent for background-image:url(...)). Таким образом вы включаете DOM-манипуляцию в директиву, а в контроллере вы можете просто обрабатывать данные (через сервис/фабрику, конечно), привязывая его к переменной области видимости и передавая ее в директиву.

+0

Большое спасибо @JesseDahl. Причина, по которой я не делаю этого в пользовательской директиве, в будущем, мы будем менять всю тему, а не только изображение на заднем плане. Если у вас есть ссылка на лекцию, которую вы пропустили, избегая манипуляций с DOM в контроллерах, я с удовольствием читаю – Jimmy

+0

. Проведя некоторое исследование, я понимаю, что вы имеете в виду. Контроллер, как предполагается, является связующим звеном между Model и View. Это должно быть довольно глупо. Я собираюсь перевести это в директиву. Еще раз спасибо @JesseDahl – Jimmy

+0

Контроллер наворотов - довольно распространенная ловушка в AngularJS, так что все возможное извлечение логики и не viewmodel вещи в какой-то провайдер. Я нахожусь редко даже с использованием манипуляций с DOM вообще в AngularJS. Хорошо подумать по-другому, а затем сказать, используя jquery и прислушиваясь к событиям, чтобы манипулировать DOM. Вместо этого сосредоточьтесь на данных. Он контролирует все и управляет поведением элементов пользовательского интерфейса (привязка show/hide к логическому значению или функции, f'instance). Есть моменты, когда вам, возможно, потребуется вернуться к манипуляции с DOM, но их немного и далеко. – JesseDahl

Смежные вопросы