angular指令 - 双向数据绑定问题

时间:2016-10-17 11:45:33

标签: angularjs data-binding angular-directive

我正在学习如何创建自定义角度指令,我想在其中使用一些双向数据绑定;但没有运气。

理念非常简单:我们有一个人员列表,一旦我选择了其中任何一个,我想在我的指令中显示所选人员的姓名(详细信息)。

在我粘贴大量代码之前,这是我的示例plunker:
https://plnkr.co/edit/xQJAWcYcscOaaNs8VlAI?p=preview

这是我所做的:
 创建主控制器:

(function() {
"use strict";
var controllerId = 'personController';
angular.module("app").controller(controllerId, ["$timeout", personController]);

function personController($timeout) {
    var vm = this;
    vm.name = "Janko";
    vm.people = returnPeople();
    vm.selectedPerson = {};
    vm.selectPerson = function (person) {
        //function to add a new Person
        vm.selectedPerson = person;
        console.log(vm.selectedPerson.name);
    };
}

function returnPeople() {
    return [
        {
            name: "Janko",
            surname: "Hrasko",
            age: 24,
            gender: "M"
        },
        {
            name: "Jozef",
            surname: "Mrkvicka",
            age: 26,
            gender: "M"
        },
        {
            name: "Janka",
            surname: "Kratka",
            age: 21,
            gender: "F"
        }
    ];
};
})();

创建指令:

(function () {
"use strict";

var app = angular.module("app");

app.directive('personDetail', personDetail);
function personDetail() {
    return {
        scope: {
            person: "=person"
        },
        restrict: 'E',
        templateUrl: '/js/person/templates/personDetail.html'
    }
};
})();

**创建的人员详细控制器:**

(function() {
"use strict";

var controllerId = 'personDetail';
angular.module("app").controller(controllerId, ["$scope", personController]);

function personController($scope) {
    var vm = this;
    vm.person = $scope.person;
}
})();

最后 - person Detail.html

<div ng-controller="personDetail as vm">
  <h3>Selected Name:</h3>
  <h3>{{vm.person.name}}</h3>
</div>

不幸的是,数据绑定无效,即使我可以看到该项已被选中。我在这里做错了什么?

修改
你的所有答案都从我的personDetail.html中删除了ng-controller,但是我想保留它(目前它只包含一个次要绑定,但我想在那里添加更多功能,如按钮点击等)。< / p>

是否可以保留控制器?

4 个答案:

答案 0 :(得分:3)

您需要将所选人员传递给指令。您已在指令中公开了“person”变量,您需要将所选人员传递给指令。而且你也不需要控制器的控制器。

更改您的指令声明:

<person-detail person="vm.selectedPerson"></person-detail>

<强>被修改

同样删除指令中的控制器,不需要额外的控制器。

<div>
  <h3>Selected Name:</h3>
  <h3>{{person.name}}</h3>
</div>

我创建了一个用于演示解决方案的plunkr。你可以看到它here

答案 1 :(得分:3)

标记:function personDetailsController($scope) { var vm = this; //vm.person = $scope.person;// This will get executed only first time. //Every time you assigning different object to it. Not changing object.property }

 function personDetail() {
   return {
      scope: {
         person: "="
      },
      bindToController: true,
      controller:'personDetailsController',
      controllerAs: 'vm',
      restrict: 'E',
      templateUrl: 'personDetail.html'
    }
 };

您可以使用控制器作为如下语法,这也保留了双向绑定。

class MyDialog : QDialog
{
public:
    MyDialog(QObject * parent = 0) : QDialog(parent) {}
    // other public stuff here
private:
    QString nomeFile;
    // other private stuff here
}

Demo

答案 2 :(得分:3)

你快到了。 我更新了您的plunkr 在index.html中,您必须指定要绑定的对象,如下所示:

<person-detail person="vm.selectedPerson"></person-detail>

不需要personDetail.js文件。在personDetail.html中,您必须将vm.person.name替换为person.name。 从角度1.5开始,你可以使用angular-components,它更容易使用。

答案 3 :(得分:2)

您在infoViewController中绑定的person应该是您未指定的元素中的属性。所以把它传递给:

directive

并在指令模板中删除<person-detail person="vm.selectedPerson"></person-detail> 的提及,将其用作:

ng-controller="personDetail as vm"