当属性双向绑定时,Angularjs未定义对象

时间:2014-03-24 11:31:15

标签: javascript angularjs

我遇到了一些我想在AngularJS中尝试做的事情。 事情是这样的:

我有一个控制器,我有一个如下定义的指令:

helpers.directive('someEvent', function() {

    ...
    scope: {
       api: '='
    }
    ...
    controller: ['$scope', function($scope) {

        $scope.hasSomeEventOccured = function(){

            return booleanVariable
        };

        $scope.api = {
           hasSomeEventOccured: $scope.hasSomeEventOccured
       }
    }]

});

然后,在其他一些控制器中我想访问该函数hasSomeEventOccured ... 控制器定义如下:

moduleName.controller('moduleSomethingController',
['$scope', '$state', 'moduleRepository', function ($scope, $state, moduleRepository) {

    $scope.theEventOccured = $scope.someEventApi.hasSomeEventOccured();

}]);

在cshtml文件中我有:

<some-event api="someEventApi" ></some-event>

<div ng-if="theEventOccured"></div>

偶尔发生的错误是$scope.someEventApi未定义。 所以这一行断开: $scope.theEventOccured = $scope.someEventApi.hasSomeEventOccured(); 我认为这是因为hasSomeEventOccuredmoduleSomethingController的调用发生在someEvent绑定完成之前。

我的问题是你如何解决这个问题?

我知道在指令中你会有类似的东西:

link: function(scope, element, attrs) {
   attrs.$observe(...);
}

但是我怎样才能在我的情况下实现等待绑定完成的事情呢?

1 个答案:

答案 0 :(得分:0)

SO-您得到的原因&#34; $ scope.someEventApi未定义&#34;错误,是因为你没有在任何地方设置它。它是未定义的!您在控制器中使用的所有内容都应该定义(var x = something ...)或者注入(就像在示例中注入$ scope)

我看到它的方式,你有两种方法可以得到你想要的东西:

  1. 一种常见且直接的方法是在控制器中定义您的功能,然后将该功能发送到指令。这意味着您需要添加类似的指令定义:
  2. scope: {theEventOccured: '&' }

    &amp;&amp;标志意味着它是一种功能。

    在控制器内

    $scope.theEventOccured = function() { /* your code here */ }
    

    这种方式 - API实际上是在控制器内定义的,指令在需要时使用它。

    1. 对于更复杂的东西 - 你可以创建一个.factory并将它绑定到你的控制器和指令。

    2. 如果您尝试在不同的控制器(或指令的控制器)之间进行通信,您可以使用工厂或$ broadcast事件。请参阅the scope api

    3. 中的$ broadcast和$ emit 另外两件重要的事情: 通常你不应该在它的父控制器范围内使用指令的功能 如果我明白你想要达到的目的,你不需要在这里观察。