问题 将对象传递给组件


我创建了一个组件,需要引用创建组件的对象。我没有上班,所有的考试都失败了。下面,我试着描述一下这个意图。

组件定义可能如下所示:

angular
    .module('myModule')
    .component('myComponent', {
        templateUrl: "template.html",
        controller: [
            MyController
        ],
        bindings: {
            myObject: '='
        }
    });

function MyController(myObject) {
    var vm = this;

    vm.myObject = myObject;
}

在服务中我想创建我的对象:

function createMyObject(args) {
        var myObject = {some: data};

        myObject.ref = "<my-component myObject='{{myObject}}'></my-component>";
        return myObject;
    }

如何将数据传递给角度组件标签?我是否必须切换回组件指令才能使其正常工作?

任何想法都非常感谢。谢谢。


9554
2018-02-28 11:01


起源

如果你打算操纵你的DOM,那么是的,你应该使用一个 自定义指令。 - LJ.Wizard
@LJ.Wizard我不想操纵DOM。下面我发布了一个解决方案 - zatziky
什么是MarkerController?它和MyController一样吗? - Martian2049
@ Matian2040是的,我已经纠正了。 - zatziky


答案:


解决方案1

在您的模板中:

<my-component key='$ctrl.myObject'></my-component>

在代码中:

angular
    .module('myModule')
    .component('myComponent', {
        templateUrl: "template.html",
        controller: [
            'objectService'
            MyController
        ],
        bindings: {
            key: '=' // or key: '<' it depends on what binding you need
        }
    });

function MyController(myObject, objectService) {
    var vm = this;

    vm.myObject.whatever(); // myObject is assigned to 'this' automatically
}

解决方案2 - 通过组件绑定

零件:

angular
.module('myModule')
.component('myComponent', {
    templateUrl: "template.html",
    controller: [
        'objectService'
        MyController
    ],
    bindings: {
        key: '@'
    }
});
function MyController(myObject, objectService) {
    var vm = this;

    vm.myObject = objectService.find(vm.key);
}

用法:

function createMyObject(args) {
    var myObject = {key: ..., some: data};

    myObject.ref = "<my-component key='" + myObject.key + "'></my-component>";
    return myObject;
}

12
2018-02-28 13:29



Zatziky,所以你不再试图传递这个物体了吗?而是你将一个字符串传递给组件?我的理解是否正确? - Michael R
@MichaelR已经有一段时间了,但一般来说问题中的例子都有效,但略有修改。代替 myObject='{{myObject}}' 你会使用控制器 myObject='$ctrl.myObject'。答案中的解决方法只是一个黑客攻击。我已相应地修改了答案。 - zatziky
请注意,key属性必须是kebab-case。示例:如果您希望密钥为myProperty,则属性必须为my-property。 - Ed Kolosovsky
@EdKolosovskiy我发布的例子是在写作时。它不再起作用了吗? - zatziky
试试吧。$ onInit = function(){console.log(this.myObject);你的问题会解决。 - yasir_mughal