Javascript 一次性绑定在自定义AngularJS指令内不起作用

Javascript 一次性绑定在自定义AngularJS指令内不起作用,javascript,angularjs,Javascript,Angularjs,我想弄清楚为什么这个代码示例中的指令中的一次性绑定值(obj.value)正在更新 如预期的那样,更新第一个字段将只更新指令内的绑定值一次。之后,在指令内部,单击“编辑”时,它还将更新一次性绑定值,并更新父范围。再次更新第一个字段不会更改指令内的值 <html> <head> <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.3/angular.min.js"></

我想弄清楚为什么这个代码示例中的指令中的一次性绑定值(obj.value)正在更新

如预期的那样,更新第一个字段将只更新指令内的绑定值一次。之后,在指令内部,单击“编辑”时,它还将更新一次性绑定值,并更新父范围。再次更新第一个字段不会更改指令内的值

<html>
<head>
     <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.3/angular.min.js"></script>
</head>
<body ng-app="myApp" ng-controller="myCtrl" ng-model-options="{updateOn: 'blur'}">
  Enter value here first, then press edit:<br>
    <input type="text" ng-model="t.value"><br>
    <br>
    Press edit, change the value and press copy:
    <my-directive obj="t"></my-directive><br><br>

    <script>

    var myApp = angular.module('myApp', []);

    myApp.directive('myDirective', function() {
        var directive = {};

        directive.restrict = 'E';
        directive.template = '<div ng-switch="edit">\
                                <div ng-switch-default>[{{ ::obj.value }}]<button ng-click="toggle()">edit</button></div>\
                                <div ng-switch-when="true">\
                                    <input type="text" ng-model="clone.value">\
                                    <button ng-click="copy()">copy</button>\
                                </div>\
                            </div>';
        directive.scope = {
            obj: '='
        };

        directive.controller = function($scope) {
            $scope.edit = false;

            $scope.toggle = function() {
                $scope.edit = true;
                $scope.clone = angular.copy($scope.obj);
            }

            $scope.copy = function() {
                $scope.obj = angular.copy($scope.clone);
                $scope.edit = false;
            }
        }

        return directive;
    });

    myApp.controller('myCtrl', function(){

    });

    </script>
</body>

首先在此处输入值,然后按编辑:


按编辑,更改值,然后按复制:

var myApp=angular.module('myApp',[]); myApp.directive('myDirective',function(){ var指令={}; directive.restrict='E'; 指令.template=\ [{{::obj.value}}]编辑\ \ \ 抄袭\ \ '; 指令范围={ 对象:'=' }; directive.controller=函数($scope){ $scope.edit=false; $scope.toggle=函数(){ $scope.edit=true; $scope.clone=angular.copy($scope.obj); } $scope.copy=函数(){ $scope.obj=angular.copy($scope.clone); $scope.edit=false; } } 返回指令; }); myApp.controller('myCtrl',function(){ });


在1.3中,他们添加了一个新的语法来帮助单向绑定,“:”。因此,您只需要将指令实现更改为
obj=“::t”

以下是您的plnkr的更新:


这里有一篇很好的文章解释了这是因为ng开关。每次重新计算它的表达式时,指令都会被“重绘”。每次都是这样,一次性表达式也会重新计算

如果将模板更改为:

directive.template = '{{::obj | json}}<div ng-switch="edit">
etc...
directive.template='{{{::obj | json}
等

您将看到它不会改变,因为它位于ng开关之外。

您想做什么?根据plunker,这是应该发生的。我想了解为什么指令中的::obj.value不断更新。您好,但direct中的值仍然会更新,并且它还有一个“:”前缀。您的指令实现看起来像
正确吗?在我的plnkr中,它工作正常。指令模板中有一个
::obj.value
。即使使用您的解决方案,此字段也会不断更新。有什么想法吗?把它从家长那里拿走。你只想把它写在指令上。因此,您只能在
上使用
谢谢,我已将其更改为ngShow和ngHide,并且单向绑定可以工作。ngIf表现出与预期相同的行为。至少可以说是令人困惑。