Angular.js传递作用域属性作为指令的引用?

3
我该如何将控制器作用域作为引用传递给我的指令?我想传递一些值,例如:
<mydirective id="data.User.id" name="data.User.name" />

将指令内部的更改更新到控制器中。

控制器中的作用域为:

    $scope.data= {
        User: {
            id: '1',
            name: 'foobar'
        }
    }

我知道我可以在指令中使用 scope: {...} 来链接一些作用域属性,就像这样。
    scope: {
        id: '=',
        name: '=',
    },

但就我所理解的而言,这基本上是“硬编码”吗?我的意思是更改后的数据将始终作为$ scope.id和$ scope.name在控制器中提供。但我想在控制器$scope.data.User.id中更改传递的data.User.id

我想使用传递给指令的数据来更新父控制器中的数据。有什么办法可以做到这一点吗?

编辑:显然我对我想要完成的事情的说明存在问题,请让我更好地解释一下。

不想在控制器作用域的特定作用域属性之间引入硬依赖关系。我基本上正在寻找一种解决方案,以向指令传递可修改的特定数据绑定。

不想这样做:

scope: {
        data: "="
}

因为这会使指令依赖于控制器的 $scope.data 存在。更糟糕的是,它还将取决于 $scope.data.User.id 和 name。我希望使指令可重用,并使用任何我传递给指令的两个值。这两个传递的值 (id, name) 应该在指令内更新,并且更改应反映在控制器作用域中。这两个传递的值 (id, name) 应该仍然绑定 (引用) 到控制器的 $scope 上。因此,我希望指令中的 name 映射到 $scope.data.User.name,而不需要将其硬编码到组件中。
也许我的整个架构都错了,如果是这样,我该怎么做得更好呢?

你为什么认为这是硬编码的?我认为在这种情况下,使用隔离作用域的双向绑定是你需要的 scope: {id:"=",name:"="} - Khanh TO
我所说的硬编码是指它依赖于控制器中属性名称的可用性。请参见我的更新问题。 - floriank
如果您在指令的控制器中读取/更新作用域会怎样? - Yaniv Efraim
我不确定你的想法是什么?我必须再次在指令中指定控制器 $scope 的确切属性,这正是我想避免的。 - floriank
我可能漏掉了什么,但我遇到了与你在这里描述的相同的冲突。其中一个选项是完全删除scope:{data:"="},并在指令的控制器中进行所有编辑/读取作用域数据。您甚至可以在内部设置$scope.data,因此指令将完全独立(无需在“外部”控制器上设置$scope.data)。说“指令的控制器”,我指的是您可以将其作为指令的一部分在其中使用的控制器。 - Yaniv Efraim
1个回答

3
您可以传递整个“data”对象,例如:
<mydirective id="data.User.id" name="data" />

然后:

scope: {
        data: "="
},

您随后将能够访问被隔离范围“data”内的所有数据。

您还可以从指令中删除隔离范围,并只在指令的控制器/链接函数中进行访问。

希望它能解答您的问题...


好的,但这正是我想要解决的问题。我不想依赖于控制器中设置的数据!这个想法是保持指令的灵活性,不使其依赖于特定的作用域值存在。 - floriank
好的,我明白了。你可以在指令的控制器中绑定到 $scope(这是你想要的吗?)。另一方面,使用隔离作用域+在外部控制器上设置指令数据的优点是,这样你可以在其他地方重复使用此指令,并从不同的控制器中获取不同的数据。 - Yaniv Efraim

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接