2016-06-03 3 views
0

UPDATE: По-видимому, устанавливая контроллер на вид такого ng-controller="SomethingController as Ctrl", а затем используя его в модели ng-model="Ctrl.myModel" работает. Что такое f ***?ng-model не относится к моему приложению

Я имел в виду реализовать this specific directive в своем приложении. Это просто требует, чтобы я поместил свою модель в качестве атрибута элемента как ng-model="myModel", и он должен работать. Я вижу примеры его работы, и я тоже работал над jsfiddle.

Однако он просто не хочет работать с моим приложением. Я установил через bower, я включил все файлы в моем index.html, и я также ввел его angular.module('myApp', ['angular-input-stars']).

Теперь проблема заключается в том, что модель работает только в моем приложении. Значение ng-model="myModel" использует значение myModel и устанавливает правильное количество звезд, но как только я меняю звезды (в и через директиву), это значение не возвращается обратно в мою модель.

Я проверил код дИРЕКТИВЫ и они используют контроллер модели установить значение:

function link(scope, element, attrs, ngModelCtrl) { 
    //... 

    scope.setValue = function (index, e) { 
     //... 
     ngModelCtrl.$setViewValue(scope.last_value); 
    }  
} 

И хотя директива не включает в return, что scope: {ngModel: '='}, это по-прежнему работает на примерах и jsFiddle , хотя я действительно не понимаю $setViewValue (даже после изучения этого).

Я думаю, что это может иметь какое-то отношение к архитектуре моего приложения, но я не уверен. Приложение является очень надежным и хорошо структурирована, и я не могу показать его код (код компании), но я могу сказать, как мы структурировали его:

|-- app.js (contains directive module, show bellow) 
|-- index.html 
|-- /modules 
     |-- /something 
      |-- /overview 
        |-- somethingController.js 
         (included in index.html & loaded through directive) 
        |-- somethingDirective.js 
         (included in index.html & loaded through app.js module) 
        |-- somethingView.html 
         (loaded through directive) 

app.js код:

var app = angular.module('myApp', [ 
    'angular-input-stars', 
    'something.overview' 
]); 

somethingDirective. ЯШ:

var somethingOverview = angular.module('something.overview'); 

somethingOverview.directive('somethingOverviewDirective', function() { 
    return { 
     restrict: 'E', 
     controller: 'SomethingOverviewController', 
     templateUrl:  'modules/something/overview/somethingOverviewView.html', 
     scope: { 
      overview: '=overview', 
      errors: '=errors' 
     } 
    }; 
}); 

somethingController.js:

var somethingOverview = angular.module('something.overview', []); 

somethingOverview.controller('SomethingOverviewController', 
    ['$scope', function ($scope) { 
     function init() { 
      $scope.myModel = 5; 
     } 

     // ... 

     init(); 
    }]); 

somethingView.html:

<div> 
    Rating: {{myModel}} 
    <input-stars max="5" ng-model="myModel"></input-stars> 
</div> 
+0

Можете ли вы p здесь есть ссылка на jsfiddle? – Jesper

+0

Самая большая разница только в том, что в jsfiddle я использую «myCtrl как Ctrl», а затем использую «Ctrl» для доступа к модели. Может ли это так? И если да, то как я могу сделать это «как», когда представление загружается директивой? Здесь: https://jsfiddle.net/filipetedim/14f05jdb/1/ – Ted

+2

Вы нарушаете золотое правило всегда иметь точку в ng-модели. Примитивы не имеют наследования. Посмотрите 3-минутное видео в ответ на http: // stackoverflow.com/questions/17606936/angularjs-dot-in-ng-model – charlietfl

ответ

2

Как @charlietfl упоминалось в комментариях, примитивное значение в рамках непосредственно является проблема

код без controllerAs:

<div ng-app="myApp"> 
    <h3>Greetings</h3> 
    <div ng-controller="MyCtrl"> 
     Hello, {{name}}! 

     <div>Rating: {{rating}}</div> 

     <input-stars ng-model="rating.value" max="5"></input-stars> 
    </div> 
</div> 


app.controller("MyCtrl", ['$scope', function($scope) { 
    $scope.rating = { 
     value: 5 
    }; 
    $scope.name = 'Superhero'; 

}]); 

Обновлено jsFiddle:

https://jsfiddle.net/14f05jdb/3/

+0

Это правильный ответ. Я хотел бы дать реквизит @charlietfl, который объяснил мне до этого. – Ted

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