Two way binding Angularjs directives isn't working

前端 未结 3 1894
温柔的废话
温柔的废话 2020-12-30 09:01

I have been trying to figure out the solution but I think i hit a dead end.

So here is my directive

directive         


        
相关标签:
3条回答
  • 2020-12-30 09:36

    be sure that you use the dot rule

    http://jimhoskins.com/2012/12/14/nested-scopes-in-angularjs.html

    0 讨论(0)
  • 2020-12-30 09:40

    It's much simpler, so I have removed some extra code you had there.

    Please take a look at the code below or working Plunker:

    <!doctype html>
    <html lang="en" ng-app="myApp">
        <head>
        <meta charset="UTF-8">
        <title>Document</title>
        <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.0.8/angular.min.js"></script>
    
        <script>
            var myApp = angular.module('myApp', []);
            myApp.directive('postprocess', function ($timeout) {
                return {
                    restrict : 'E',
                    transclude: 'true',
                    scope: {
                        myVariable: '='
                    },
                    link: function(scope, element, attrs) {
                        $timeout(function () {
                            scope.myVariable = 'Bye bye!'
                        }, 200);
                    }  
                };
            });
    
            myApp.controller('myAppCtrl', ['$scope', '$timeout', function ($scope, $timeout) {
                $scope.myVariable = {
                    value : 'Holla'
                };
    
                console.log($scope.myVariable.value); // -> prints initial value
                $timeout(function () {
                    console.log($scope.myVariable.value); // -> prints value after it is changed by the directive
                }, 2000);
            }])
        </script>
    
        </head>
        <body ng-controller="myAppCtrl">
            <postprocess my-variable="myVariable.value" style="padding-top: 10px;" />
        </body>
    </html>
    
    1. The controller sets the initial value to 'Holla'
    2. The directive receives that value by the my-variable attribute
    3. Using two way data-binding any changes made to scope.myVariable updates the $scope.myVariable of the main controller
    4. After few seconds $scope.myVariable changes to 'Bye Bye'
    5. Take a look at your console.log

    $watch and $apply

    Angular's two-way data binding is the root of all awesome in Angular. However, it's not magic, and there are some situations where you need to give it a nudge in the right direction.

    When you bind a value to an element in Angular using ng-model, ng-repeat, etc., Angular creates a $watch on that value. Then whenever a value on a scope changes, all $watches observing that element are executed, and everything updates.

    Sometimes, usually when you're writing a custom directive, you will have to define your own $watch on a scope value to make the directive react to changes.

    On the flip side, sometimes you change a scope value in some code but the app doesn't react to it. Angular checks for scope variable changes after pieces of your code have finished running; for example, when ng-click calls a function on your scope, Angular will check for changes and react. However, some code is outside of Angular and you'll have to call scope.$apply() yourself to trigger the update. This is most commonly seen in event handlers in custom directives.

    0 讨论(0)
  • 2020-12-30 09:52

    Some help from angularjs irc, & dluz, updated. Though I wish there was an easier way for the directive to be called, since the link function contains behavior and there should be a way to call that.

    http://jsfiddle.net/T7cqV/5/

    0 讨论(0)
提交回复
热议问题