2016-01-07 2 views
2

Я неправильно использую объекты. В принципе, я хочу:Директива AngularJS не оценивает объект должным образом

angular.module('mobileDashboardApp') 
    .directive('localForageModel', function ($localForage) { 
     return { 
      link: function postLink(scope, element, attrs) { 
       scope.$watch(attrs.ngModel, function() { 
        $localForage.setItem(attrs.localForageModel, scope[attrs.ngModel]); 
        console.log(attrs.ngModel); 
        console.log(scope[attrs.ngModel]); 
        console.log(scope.user.companyId); 
        console.log(scope["user.companyId"]); 
       }); 
      } 
     }; 
    }); 

к выходу

user.companyId 
dsf 
dsf 
dsf 

вместо выходного тока, который является:

user.companyId 
undefined 
dsf 
undefined 

Может кто-нибудь мне точку в правильном направлении? Или предложить лучшее название для этого?

ответ

1

Вы неверная запись, она должна быть

var props = attrs.ngModel.split("."); 
scope[props[0]][props[1]] 

В нотации точечной не действительны для динамических свойств, так object['abc.def'] должно быть записаны как object['abc']['def']

Side-нота, безусловно, вы должны иметь какое-то проверки свойств объекта, например, если ваш атрибут ngModel не равен abc.def - это вызовет исключение, поэтому лучше иметь общую функцию для этого

+0

Мне очень жаль? Что-то получилось вырезано? – user2476265

+0

@ user2476265 да, извините, обновлено –

+0

как я могу сделать так, чтобы он мог обрабатывать abc.def и abc.def.another и abc.def.another.another? – user2476265

0

В JS есть разница между именем свойства, содержащим . (точка) и вложенными объектами, к которым обращается точка. Итак, scope.user.companyId - это нечто иное, чем scope["user.companyId"]. Вы можете иметь JS объект вроде этого:

{ 
    user: { 
     companyId: 1 
    }, 
    "user.companyId" : 2 
} 

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

function getProperty(obj, pathString) { 
    var properties = pathString.split("."); 
    var result = obj; 
    for (var i in properties) { 
    result = result[properties[i]]; 
    } 
    return result; 
} 

В вашем случае можно использовать так: getProperty(scope, "user.companyId").

0

Способ, которым вы обращаетесь к объекту, неверен, например. console.log(scope["user.companyId"]);

Это должно быть console.log(scope["user"]["companyId"]);

Я надеюсь, что это поможет вам :-)

+0

Предполагая, что ваш объект примерно такой: scope.user = {companyId: 1} –

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