2016-01-20 3 views
4

Почему я не могу имею обязательную силу в вложенном объекте в моем объекте области видимости, как это:Вложенный объект внутри объекта области видимости в пользовательской директиве

app.directive('myDirective', function() { 
    return { 
     scope: { 
      dropdown: { 
       option: '=selectedOption' //not working 
      } 
     } 
    } 
}) 

я получаю сообщение об ошибке:

a.match is not a function

Вот working plunker.

+0

Чего вы хотите достичь? –

+0

Я хочу переменную в моей директиве, которая является свойством объекта и привязана к переменной в контроллере. –

+0

Итак, вы пробовали вот так: 'scope: {" dropdown.option ":" = selectedOption "}'? –

ответ

1

Ответ на «почему» это «потому что это не то, как это работает».

Исходный код AngularJS, который анализирует возможности для директивы здесь: https://github.com/angular/angular.js/blob/master/src/ng/compile.js#L829

function parseIsolateBindings(scope, directiveName, isController) { 
    var LOCAL_REGEXP = /^\s*([@&]|=(\*?))(\??)\s*(\w*)\s*$/; 

    var bindings = {}; 

    forEach(scope, function(definition, scopeName) { 
     var match = definition.match(LOCAL_REGEXP); 

     if (!match) { 
     throw $compileMinErr('iscp', 
      "Invalid {3} for directive '{0}'." + 
      " Definition: {... {1}: '{2}' ...}", 
      directiveName, scopeName, definition, 
      (isController ? "controller bindings definition" : 
      "isolate scope definition")); 
     } 

     bindings[scopeName] = { 
     mode: match[1][0], 
     collection: match[2] === '*', 
     optional: match[3] === '?', 
     attrName: match[4] || scopeName 
     }; 
    }); 

    return bindings; 
    } 

Как вы можете видеть, это делает один проход через свойство scope объекта и не рекурсивно спускаться в свойство объекта.

+0

Получил, так что это невозможно. Можно ли это назвать ошибкой? Потому что это хорошая практика, чтобы не иметь прямых привязок к сфере охвата, и это ограничивает нас прямым привязкой к сфере действия в директивах? –

+0

@TarunDugar Похоже на разумный запрос. Вы можете отправлять вопросы на GitHub. –

0

не уверен, если это будет работать или нет:

scope: { 
    "dropdown.option": "=selectedOption" 
} 

Но, как решить эту проблему, вы можете написать так:

app.directive('myDirective', function() { 
    return { 
     scope: { 
      dropdownOption: "=selectedOption" 
     }, 
     controller: ["$scope", function($scope) { 
      $scope.dropdown = $scope.dropdown || {}; 

      $scope.$watch('dropdownOption', function(newValue) { 
       $scope.dropdown.option = newValue; 
      }); 


      $scope.$watch('dropdown.option', function(newValue) { 
       $scope.dropdownOption = newValue; 
      }); 
     }] 
    } 
}) 
+0

Первый не работает. Второй вариант - обходное решение, но вопрос в том, почему мы не имеем вложенных объектов, как упоминалось. –

+0

О! правый Тарун. Не уверен в причине, но, вероятно, сам Угловой не поддерживает ее. Вы видели такой пример? –

+0

Нет, у меня нет, но его хорошо известной практики избегать прямых привязок с областью видимости. В противном случае у меня могут быть такие проблемы: http://stackoverflow.com/questions/19310129/ng-model-no-longer-updates-after-typing-into-text-input. И мне также просто любопытно, почему это не поддержка (если это не так). :) –

Смежные вопросы