2016-08-29 2 views
0

У меня есть директива iscolated scope, которая разделяет область с '='. Нам нужно передать объект в директиву. Когда объект передается в директиву с его свойствами, директива работает нормально, и объект, после изменения в директиве, корректно возвращается вызывающему представлению.Угловая директива 1.5.7 двусторонняя привязка нулевого объекта

Однако, когда вызывающий вид передает тот же объект, который объявлен как null, даже после изменения объекта в директиве объект возвращается как null.

Соответствующие части директивы приведены ниже:

.directive("lookupCentrosDeGestion", function() { 
    var _controller = ['centrosDeGestionServices', 'toastr', function (centrosDeGestionServices, toastr) { 
     var dvm = this; 

     ... 

     dvm.rowSelected = function (item) { 
      if (!dvm.centroDeGestion) 
       dvm.centroDeGestion = {}; 
      dvm.centroDeGestion.crecodigo = angular.copy(item.crecodigo); 
      dvm.centroDeGestion.crenombre = angular.copy(item.crenombre); 
      dvm.centroDeGestion.divcodigo = angular.copy(item.divcodigo); 
      dvm.centroDeGestion.empRazonSocial = angular.copy(item.empRazonSocial); 
      dvm.centroDeGestion.empid = angular.copy(item.empid); 
      dvm.centroDeGestion.prynombre = angular.copy(item.prynombre); 
      dvm.centroDeGestion.prynumero = angular.copy(item.prynumero); 
      dvm.centroDeGestion.unicodigo = angular.copy(item.unicodigo); 
      dvm.showMainParent(); 
     } 

     dvm.showMainParent = function() { 
      dvm.view.active = dvm.view.returnTo; 
     } 

    }]; 

    return { 
     restrict: 'E', 
     scope: { 
      view: '=', 
      centroDeGestion: '=', 
      centroDeProcesoId: '=', 
      centroDeProcesoName: '=', 
     }, 
     link: _link, 
     controller: _controller, 
     controllerAs: 'dvm', 
     bindToController: true, 
     templateUrl: '/hr/admin/centrosDeGestion/lookupCentrosDeGestion.html' 
    }; 



}) 

Если нулевой объект передается в директиве (dvm.centroDeGestion), я creaste новый объект, а затем присвоить его свойства, однако вид вызова по-прежнему получает нуль.

Я также хотел бы назначить объект напрямую, вместо того, чтобы назначать каждое свойство, но строка dvm.centroDeGestion = angular.copy(ítem) всегда будет возвращать значение null.

Любые идеи о том, как решить эти проблемы?

Заранее спасибо

+0

Не будет использовать @ вызывать директиву для обработки объекта как строки? Я все равно пытался, но не повезло. – aplon

+0

Один из способов - связать пустой объект с свойством centroDeGestion директивы в случае, если модель является нулевой, а не инициализирует ее в пустой объект внутри директивы. – Developer

ответ

1

Заметки о связывании данных в целом

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

В этом случае, если вы пытаетесь связать нуль, вы не указываете на какую-либо память, поэтому нет привязки.

Обратите внимание, что с привязками, если вы повторно назначили переменную, вы разбьете привязку, потому что вызывающий объект не знает о новой переменной. Если вы только измените свойства переменной, у вызывающего будет по-прежнему ссылка на него, и привязка будет работать.

Для иллюстрации рассмотрим следующий код:

var a = {}; 
var b = a; // aka data-binding 

b.foo = 'bar'; // a.foo == 'bar' (because b === a) 

b = {}; // b !== a (whoops! broken binding!) 
b.baz = 'biz'; // a.baz == undefined 

Глядя на своей реализации ...

Допустим, вы используете эту директиву следующим образом: <lookup-centros-de-gestion centro-de-gestion="foo">

Простое решение будет чтобы вызывающий абонент инициализировал $scope.foo = {}; и удалил dvm.centroDeGestion={}; из функции rowSelected (потому что переназначение «root» v переносимые перерывы! - как и в вызывающем абоненте, все еще есть свой объект $scope.foo, но это не та память, что и выделенный dvm.centroDeGestion).

Другим решением было бы привязать объект и установить на нем определенное свойство. ex: dvm.centroDeGestion.data={};, то для доступа к его объектам в вашем абоненте вы бы использовали foo.data.*

Надеюсь, это объяснение имеет смысл. Я попробую уточнить, есть ли у вас какие-либо вопросы по этому поводу.

+0

Большое спасибо за ваше четкое объяснение. Итак, в нижней строке, не передавайте нулевой объект в директиву и ожидайте возврата объекта со свойствами. Любые идеи о том, почему назначение объекта не работает, и я должен назначить свойство по свойству? – aplon

+0

Как я уже сказал, если вы повторно назначаете переменную, привязанную к данным, она прерывает привязку, потому что вызывающий объект не знает о вновь созданной переменной. В нижней строке никогда не переписывается связанная с данными переменная в директиве, в которую она привязана. Я почти всегда копирую каждое свойство в объект, если мне нужно. Это очень просто, используя: 'for (var prop in src) {dest [prop] = src [prop]; } ' – plong0

+0

отредактировал ответ немного, чтобы уточнить пояснения – plong0