Angularjs 角度-通过ng开关进行双向绑定

Angularjs 角度-通过ng开关进行双向绑定,angularjs,angularjs-directive,angularjs-scope,Angularjs,Angularjs Directive,Angularjs Scope,我有一个带有作用域的指令和一个双向'='绑定到父作用域值(是的,在对象内部以避免继承问题)。该指令的模板依次包含一个ng开关,这当然会创建另一个作用域。在ng开关内,我希望将textarea绑定到原始值。它正确初始化,但当用户编辑该值时,父作用域值不会更改 var myApp = angular.module('myApp', []); myApp.directive('csContenteditable', function () { return { restric

我有一个带有作用域的指令和一个双向'='绑定到父作用域值(是的,在对象内部以避免继承问题)。该指令的模板依次包含一个ng开关,这当然会创建另一个作用域。在ng开关内,我希望将textarea绑定到原始值。它正确初始化,但当用户编辑该值时,父作用域值不会更改

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

myApp.directive('csContenteditable', function () {
    return {
        restrict: 'A',
        scope: {
            content: "=",
            editMode: "=csContenteditable",
        },
        template: 
            "<div ng-switch='editMode'>" +
                "<div ng-switch-when='false'>{{content}}</div>" +
                "<div ng-switch-when='true'><textarea ng-model='content'/><div>" +
            "<div>"

    };
});


function MyCtrl($scope) {
    $scope.editMode = false;
    $scope.values = {value: 'foo'}
}
var myApp=angular.module('myApp',[]);
myApp.directive('csContenteditable',function(){
返回{
限制:“A”,
范围:{
内容:“=”,
编辑模式:“=csContenteditable”,
},
模板:
"" +
“{{content}}”+
"" +
""
};
});
函数MyCtrl($scope){
$scope.editMode=false;
$scope.values={value:'foo'}
}
正确的方法是什么?我可以使用ng show而不是ng switch,它可以工作,b/c没有额外的作用域,但使我的DOM比实际情况中需要的要重得多

演示:

  • 单击“编辑模式”复选框
  • 注意文本区域用“foo”初始化
  • 现在输入文本区域
  • 注意,外部范围中的“当前值”不会更新

    • 我会倒霉的,我刚刚解决了这个问题。答案是在指令内的两种情况下都使用
      $parent.content
      而不是
      content

      这是一个
      范围
      问题。。。
      ng如果指令创建了一个新范围,这就是模型未更新的原因

      若您像在那个里使用的那个样使用基元对象,那个么子作用域将创建新实例,而不是从父作用域继承

      绑定
      而不是
      值。值
      是一个基本变量,您的指令范围不会对原始对象进行阴影/隐藏

      这是您的html

      <div content="values" cs-contenteditable="editMode" />
      
      
      
      这是指令的模板

      "<div ng-switch='editMode'>" +
         "<div ng-switch-when='false'>{{content.value}}</div>" +
         "<div ng-switch-when='true'><textarea ng-model='content.value'/><div>" +
      "<div>"
      
      “”+
      “{content.value}}”+
      "" +
      ""
      
      有关更多信息,请查看

      这里是最新的

      更新


      我建议使用复杂对象而不是使用$parent,因为如果您在指令中使用一些指令创建新范围,如
      ng if
      中断$parent解决方案,下面是一个例子…

      或者你可以使用
      内容。value
      而不是
      内容
      $parent不是一个很好的方法。基本上,如果你发送一个基本对象,子范围创建一个新的instance@wickY26这就是我困惑的地方。我认为,通过在根作用域中创建values对象并将values.value传递到directives content属性中,我应该避免这个问题,内部作用域中的内容应该指向外部作用域中的values.value。你能帮我看看为什么不是这样吗?我知道你的小提琴很管用。所以,我知道它管用,但这是我的问题。假设我的模型是:recipe:{name:“foo”,flavor:“bar”}。这是来自服务器的json,我不想在它的两个方向上进行可怕的转换。现在我想用我的指令来编辑这两个字段。我需要能够写作和写作。我不会写字。这就是为什么我认为$parent是一个更好的解决方案