Я пытаюсь создать угловую директиву, которая сможет получить ОБА объект модели и строку.
если директива получает строку, она просто выводит HTML, но если это модель, директива будет следить за изменениями модели и выводить данные соответственно.

Я пытался использовать следующий код:

App.directive('iso2symbol', function () {
    return {
        restrict: 'E',
        replace: true,
        link: function ($scope, $element, $attrs) {
            var curIsoObj = $scope.$eval($attrs.curIso);
            //this is object it may change
            if (typeof curIsoObj !== 'undefined') {
                console.log('not a text');
                $scope.$watch('curIso', function (value) {
                   console.log(value);
                });
            }
        },
        template: '<span>{{currencySymbol}}</span>'
    }
}]);

Это не работает, я долго гуглил и не нашел проблемы....

Вот ссылка на JSfiddle, где я установил DEMO

0
Wazime 4 Мар 2015 в 01:24
Действительно ли это лучший способ справиться с проблемами? Что, если вы столкнетесь со случаем, когда предполагается, что это строка, но у вас есть объект модели с той же строкой? Ваш код не будет интерпретировать его как строку, и он не будет работать должным образом, тогда вы потратите часы на его отладку.
 – 
yangli-io
4 Мар 2015 в 01:27
Эта директива должна действовать как фильтр... Я не могу использовать здесь фильтр для по разным причинам, поэтому мне нужно, чтобы он принимал любой тип данных.
 – 
Wazime
4 Мар 2015 в 01:30

2 ответа

Будьте осторожны с тем, что вы смотрите.

В соответствии с вашей функцией часов вы смотрите $scope.curIso, который на самом деле не является объектом области.

Ты должен смотреть

$scope.$watch(function(){return $scope.$eval($attrs.curIso);}, function (value) {
    $scope.txt = value;
});
0
yangli-io 4 Мар 2015 в 01:36
Просто будьте осторожны, вы проверяете версию строковой версии/объекта модели в том же контроллере, поскольку вы ссылаетесь на $scope.txt, который, изменив его в одной директиве, изменит его во всех других директивах.
 – 
yangli-io
4 Мар 2015 в 01:42

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

App.directive('iso2symbol', function () {
    return {
        restrict: 'E',
        replace: true,
        require: 'ngModel',
        scope: {
            curIso: '='
        },
        link: function ($scope, $element, $attrs) {
            $scope.$observe('curIso', function(newValue, oldValue){
                var curIsoObj = newValue;
                // Do your test now to see if it's undefined,
                // a string, or generic object.
                // (the first time it will likely be undefined)
            }
        },
        template: '<span>{{currencySymbol}}</span>'
    }
}]);
0
HankScorpio 4 Мар 2015 в 01:46