Подтвердить что ты не робот

Как установить интерполированное значение в директиве angular?

Как установить интерполированное значение в директиве? Я могу прочитать правильное значение из следующего кода, но я не смог его установить.

JS:

app.directive('ngMyDirective', function () {
    return function(scope, element, attrs) {
        console.log(scope.$eval(attrs.ngMyDirective));

        //set the interpolated attrs.ngMyDirective value somehow!!!
    }
});

HTML:

<div ng-my-directive="myscopevalue"></div>

где myscopevalue - это значение в области моего контроллера.

4b9b3361

Ответ 1

Если вы хотите установить значение в области видимости, но не знаете имя свойства (раньше времени), вы можете использовать синтаксис object[property]:

scope[attrs.myNgDirective] = 'newValue';

Если строка в атрибуте содержит точку (например, myObject.myProperty), это не сработает; вы можете использовать $eval для выполнения задания:

// like calling  "myscopevalue = 'newValue'"
scope.$eval(attrs.myNgDirective + " = 'newValue'");

[Обновление: вам следует использовать $parse вместо $eval. См. Отметьте ответ.]

Если вы используете область выделения, вы можете использовать аннотацию =:

app.directive('ngMyDirective', function () {
    return {
        scope: {
            theValue: '=ngMyDirective'
        },
        link: function(scope, element, attrs) {
            // will automatically change parent scope value
            // associated by the variable name given to `attrs.ngMyDirective`
            scope.theValue = 'newValue';
        }
    }
});

Вы можете увидеть пример этого в этот пример Angular/jQuery color picker JSFiddle, где присвоение scope.color внутри директива автоматически обновляет переменную, переданную в директиву по области управления.

Ответ 2

Всякий раз, когда директива не использует область выделения и вы указываете свойство scope с использованием атрибута, и вы хотите изменить это значение свойства, я предлагаю использовать $parse. (Я думаю, что синтаксис лучше, чем $eval.)

app.directive('ngMyDirective', function ($parse) {
    return function(scope, element, attrs) {
        var model = $parse(attrs.ngMyDirective);
        console.log(model(scope));
        model.assign(scope,'Anton');
        console.log(model(scope));
    }
});

fiddle

$parse работает независимо от того, содержит ли атрибут точку.