2015-01-05 4 views
0

создать новую область в директиве, как этотAngularJS: переменная Scope неопределенный в контроллере

controllersModule.directive('uploadBox', function() { 
return { 
    restrict: 'E', 
    scope: { 
     topic: '=topic', 
     label: '=label' 
    }, 
    templateUrl: '/assets/directives/uploadBox.html' 
};}); 

И использовать эту директиву, как это (оба значения -label и конкретные темы являются значение, которые хранятся в файлах в формате JSON , в двух разных контроллерах)

<upload-box label="lc.getTerm('system_upload')" topic="tc.currentTopic.uID"></upload-box> 

Таким образом, метка атрибута и тема передаются в новую (созданную) область. Теперь, самое смешное, в то время как я могу получить доступ оба значения в шаблоне HTML файл (uploadBox.html)

<div ng-controller="DropUploadCtrl"> 
    <button class="btn btn-success" dropzone="dropzoneConfig"> 
     <!-- label is correctly shown --> 
     {{ label }} 
    </button> 

    <!-- this link works fine: Evaluates to something like aaa/54dg54...SHA128-Hash...G4FX--> 
    <a ng-href="aaa/{{ topic }}">BB</a> 
</div> 

Только значение метки доступно внутри DropUploadController.

controllersModule.controller('DropUploadCtrl', ['$scope',function($scope) { 
var that = this; 

console.log($scope.label); // this is working fine 
console.log($scope.topic); // this is undefined 

// some more stuff here 

}]); 

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

Большое спасибо

EDIT:

Выход для rootScope в контроллере

console.log("$scope::>"); 
console.log($scope.label); 
console.log($scope.topic); 
console.log("$rootScope::>") 
console.log($rootScope.label); 
console.log($rootScope.topic); 

выглядит следующим образом:

"$scope::>" 
"I'm a label" 
undefined 
"$rootScope::>" 
undefined 
undefined 

Кроме того, значение не определено в функции связи директивы

Редактировать2: Решение было найдено! Значение в tc.currentTopic.uID не было заполнено в момент инициализации другого контроллера. Вот почему выражение {{topic}} работает нормально, потому что оно было снова оценено, когда значение изменилось, через пару мс позже. Теперь я получаю данные прямо через $ routeParams.

+0

тег элемента является 'закачивать-box' но директива она определяется как' uploadBox', что нарочно? – ochi

+0

Проверьте, имеет ли значение tc.currentTopic.uID значение в родительской области. –

+2

@ochi Это соглашение в Angular, в этом нет ничего плохого. –

ответ

1

Директивы имеют изолированные области. С тех пор как вы добавили:

scope: { 
     topic: '=topic', 
     label: '=label' 
    }, 

он создал изолированный объем. Но в угловой документации указано: = или =attr - установить двунаправленную привязку между локальным свойством scope и свойством родительской видимости имени, определяемого значением атрибута attr. Если имя attr не указано, предполагается, что имя атрибута совпадает с локальным именем. Учитывая <widget my-attr="parentModel"> и определение виджета области видимости: { localModel:'=myAttr' }, то свойство области виджетов localModel будет отображать значение parentModel в родительской области.Любые изменения в parentModel будут отражены в localModel, и любые изменения в localModel отразятся на parentModel.

Ссылка here

+0

Выход для корневого объекта в контроллере console.log ("$ scope ::>"); console.log ($ scope.label); console.log ($ scope.topic); console.log ("$ rootScope ::>") console.log ($ rootScope.label); console.log ($ rootScope.topic); выглядит следующим образом: «$ сферы ::>» «Я ярлык» неопределенные «$ rootScope ::>» неопределенных неопределенных Интересно, что я могу получить доступ к теме в шаблоне HTML BB PlasmaLampe

+0

Вы можете вытаскивать $ scope.label и $ scope.topic с сервера в $ http или $ resource call в вашем контроллере в любой момент? Было бы полезно увидеть все видимости $ scope.label и $ scope.topic в вашем контроллере. –

+0

нет, все обрабатывается на стороне клиента. Я думаю, что главный вопрос: в чем разница между доступом в контроллере от доступа через ng-href = "aaa/{{topic}}" внутри шаблона, не так ли? – PlasmaLampe

0

Прежде всего, если вы запустите console.log(scope.label); в своей функции ссылки в директиве (которой у вас нет на данный момент, вам придется добавить ее), получается ли это значение?

Во-вторых, похоже, что вы хотите, чтобы директива изменила значение в области родительского контроллера. Иногда вы можете получать странные вещи, когда вы это делаете. В this answer рекомендуется обертывать эти значения в контроллере в объекте.

+0

значение также не определено в функции ссылки. – PlasmaLampe

+0

Тогда директива не получает значения для темы вообще. Но, поскольку он, кажется, получает его в какой-то момент (именно поэтому он будет выводиться в его шаблоне), это заставляет меня полагать, что «тема» ждет обещанного какого-то рода, который разрешается после вызова 'console.log()' , Если это так, я предлагаю вам попробовать обернуть этот код в контроллере в обратном вызове с обещаниями (например: 'then()'). – Joao